From d62510f9b5a75c044e38718c23310832a42faca1 Mon Sep 17 00:00:00 2001 From: JuJu <857815116@qq.com> Date: Sat, 12 Sep 2020 09:48:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=8C=9F=20=E5=A2=9E=E5=8A=A0=20?= =?UTF-8?q?=E6=94=BE=E8=A1=8C=E7=99=BD=E5=90=8D=E5=8D=95=E9=80=9A=E9=85=8D?= =?UTF-8?q?=E7=AC=A6=E5=8C=B9=E9=85=8D=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/core/utils/AuthUtils.java | 80 +++++++++++++++++++ .../com/ruoyi/gateway/filter/AuthFilter.java | 5 +- 2 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java new file mode 100644 index 00000000..5028d3d8 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java @@ -0,0 +1,80 @@ +package com.ruoyi.common.core.utils; + +import java.util.Collection; +import java.util.regex.Pattern; + +/** + * 白名单URL匹配工具类 + * + * @author DokiYolo + */ +public class AuthUtils { + + public static String getRegPath(String path) { + char[] chars = path.toCharArray(); + int len = chars.length; + StringBuilder sb = new StringBuilder(); + boolean preX = false; + for (int i = 0; i < len; i++) { + //遇到*字符 + if (chars[i] == '*') { + //如果是第二次遇到*,则将**替换成.* + if (preX) { + sb.append(".*"); + preX = false; + //如果是遇到单星,且单星是最后一个字符,则直接将*转成[^/]* + } else if (i + 1 == len) { + sb.append("[^/]*"); + //否则单星后面还有字符,则不做任何动作,下一把再做动作 + } else { + preX = true; + } + //遇到非*字符 + } else { + //如果上一把是*,则先把上一把的*对应的[^/]*添进来 + if (preX) { + sb.append("[^/]*"); + preX = false; + } + //接着判断当前字符是不是?,是的话替换成. + if (chars[i] == '?') { + sb.append('.'); + //不是?的话,则就是普通字符,直接添进来 + } else { + sb.append(chars[i]); + } + } + } + return sb.toString(); + } + + /** + * 通配符模式 + * + * @param excludePath - 不过滤地址 + * @param reqUrl - 请求地址 + * @return true/false + */ + public static boolean filterUrls(String excludePath, String reqUrl) { + String regPath = getRegPath(excludePath); + return Pattern.compile(regPath).matcher(reqUrl).matches(); + } + + /** + * 检验是否在非过滤地址 + * + * @param excludeUrls - 不过滤地址 + * @param reqUrl - 请求地址 + * 一次匹配直接返回 + * @return true/false + */ + public static boolean checkWhiteList(Collection excludeUrls, String reqUrl) { + for (String excludeUrl : excludeUrls) { + if (filterUrls(excludeUrl, reqUrl)) { + return true; + } + } + return false; + } + +} diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java index d1c26b65..443029a1 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java @@ -2,6 +2,8 @@ package com.ruoyi.gateway.filter; import java.util.Arrays; import javax.annotation.Resource; + +import com.ruoyi.common.core.utils.AuthUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.gateway.filter.GatewayFilterChain; @@ -44,8 +46,7 @@ public class AuthFilter implements GlobalFilter, Ordered { String url = exchange.getRequest().getURI().getPath(); // 跳过不需要验证的路径 - if (Arrays.asList(whiteList).contains(url)) - { + if(AuthUtils.checkWhiteList(Arrays.asList(whiteList),url)){ return chain.filter(exchange); } String token = getToken(exchange.getRequest()); From c93ebf445fe5b36e6e708b9ea8de126c059c88b6 Mon Sep 17 00:00:00 2001 From: JuJu <857815116@qq.com> Date: Sat, 12 Sep 2020 11:54:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=92=A5=20=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E7=A7=81=E6=9C=89=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/common/core/utils/AuthUtils.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java index 5028d3d8..2d333de6 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/AuthUtils.java @@ -1,6 +1,8 @@ package com.ruoyi.common.core.utils; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.regex.Pattern; /** @@ -10,7 +12,7 @@ import java.util.regex.Pattern; */ public class AuthUtils { - public static String getRegPath(String path) { + private static String getRegPath(String path) { char[] chars = path.toCharArray(); int len = chars.length; StringBuilder sb = new StringBuilder(); @@ -55,7 +57,7 @@ public class AuthUtils { * @param reqUrl - 请求地址 * @return true/false */ - public static boolean filterUrls(String excludePath, String reqUrl) { + private static boolean filterUrls(String excludePath, String reqUrl) { String regPath = getRegPath(excludePath); return Pattern.compile(regPath).matcher(reqUrl).matches(); }