From efab0a675f913aec4b7080ff8d03ebdd8346e8e6 Mon Sep 17 00:00:00 2001 From: smallchill Date: Mon, 22 Feb 2021 22:58:01 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=94=BE=E8=A1=8C=E6=94=AF=E6=8C=81=E9=80=9A=E9=85=8D=E7=AC=A6?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/filter/AuthFilter.java | 6 ++- .../gateway/filter/RequestFilter.java | 45 +++++++++++++++++++ .../gateway/provider/AuthProvider.java | 36 +++++++-------- 3 files changed, 66 insertions(+), 21 deletions(-) create mode 100644 blade-gateway/src/main/java/org/springblade/gateway/filter/RequestFilter.java diff --git a/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java b/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java index 4de53bfe..1e29459e 100644 --- a/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java +++ b/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java @@ -32,6 +32,7 @@ import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -49,6 +50,7 @@ import java.nio.charset.StandardCharsets; public class AuthFilter implements GlobalFilter, Ordered { private final AuthProperties authProperties; private final ObjectMapper objectMapper; + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { @@ -72,8 +74,8 @@ public class AuthFilter implements GlobalFilter, Ordered { } private boolean isSkip(String path) { - return AuthProvider.getDefaultSkipUrl().stream().map(url -> url.replace(AuthProvider.TARGET, AuthProvider.REPLACEMENT)).anyMatch(path::contains) - || authProperties.getSkipUrl().stream().map(url -> url.replace(AuthProvider.TARGET, AuthProvider.REPLACEMENT)).anyMatch(path::contains); + return AuthProvider.getDefaultSkipUrl().stream().anyMatch(pattern -> antPathMatcher.match(pattern, path)) + || authProperties.getSkipUrl().stream().anyMatch(pattern -> antPathMatcher.match(pattern, path)); } private Mono unAuth(ServerHttpResponse resp, String msg) { diff --git a/blade-gateway/src/main/java/org/springblade/gateway/filter/RequestFilter.java b/blade-gateway/src/main/java/org/springblade/gateway/filter/RequestFilter.java new file mode 100644 index 00000000..bb66e9df --- /dev/null +++ b/blade-gateway/src/main/java/org/springblade/gateway/filter/RequestFilter.java @@ -0,0 +1,45 @@ +package org.springblade.gateway.filter; + +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR; +import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl; + +/** + * request过滤器 + * + * @author lengleng + */ +@Component +public class RequestFilter implements GlobalFilter, Ordered { + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + addOriginalRequestUrl(exchange, request.getURI()); + String rawPath = request.getURI().getRawPath(); + String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")) + .skip(1L).collect(Collectors.joining("/")); + ServerHttpRequest newRequest = request.mutate() + .path(newPath) + .build(); + exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI()); + return chain.filter(exchange.mutate().request(newRequest.mutate().build()).build()); + } + + @Override + public int getOrder() { + return -1000; + } + +} diff --git a/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java b/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java index a107e797..1dc12208 100644 --- a/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java +++ b/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java @@ -27,34 +27,32 @@ import java.util.List; */ public class AuthProvider { - public static String TARGET = "/**"; - public static String REPLACEMENT = ""; public static String AUTH_KEY = TokenConstant.HEADER; - private static final List defaultSkipUrl = new ArrayList<>(); + private static final List DEFAULT_SKIP_URL = new ArrayList<>(); static { - defaultSkipUrl.add("/example"); - defaultSkipUrl.add("/token/**"); - defaultSkipUrl.add("/captcha/**"); - defaultSkipUrl.add("/actuator/health/**"); - defaultSkipUrl.add("/v2/api-docs/**"); - defaultSkipUrl.add("/auth/**"); - defaultSkipUrl.add("/oauth/**"); - defaultSkipUrl.add("/log/**"); - defaultSkipUrl.add("/menu/routes"); - defaultSkipUrl.add("/menu/auth-routes"); - defaultSkipUrl.add("/tenant/info"); - defaultSkipUrl.add("/order/create/**"); - defaultSkipUrl.add("/storage/deduct/**"); - defaultSkipUrl.add("/error/**"); - defaultSkipUrl.add("/assets/**"); + DEFAULT_SKIP_URL.add("/example"); + DEFAULT_SKIP_URL.add("/token/**"); + DEFAULT_SKIP_URL.add("/captcha/**"); + DEFAULT_SKIP_URL.add("/actuator/health/**"); + DEFAULT_SKIP_URL.add("/v2/api-docs/**"); + DEFAULT_SKIP_URL.add("/auth/**"); + DEFAULT_SKIP_URL.add("/oauth/**"); + DEFAULT_SKIP_URL.add("/log/**"); + DEFAULT_SKIP_URL.add("/menu/routes"); + DEFAULT_SKIP_URL.add("/menu/auth-routes"); + DEFAULT_SKIP_URL.add("/tenant/info"); + DEFAULT_SKIP_URL.add("/order/create/**"); + DEFAULT_SKIP_URL.add("/storage/deduct/**"); + DEFAULT_SKIP_URL.add("/error/**"); + DEFAULT_SKIP_URL.add("/assets/**"); } /** * 默认无需鉴权的API */ public static List getDefaultSkipUrl() { - return defaultSkipUrl; + return DEFAULT_SKIP_URL; } }