diff --git a/pom.xml b/pom.xml index 363a1b7..02c4096 100644 --- a/pom.xml +++ b/pom.xml @@ -99,6 +99,19 @@ org.springframework.boot spring-boot-starter-actuator + + + + com.github.xiaoymin + knife4j-gateway-spring-boot-starter + 4.4.0 + + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + diff --git a/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java b/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java index 7f3264d..861f844 100644 --- a/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java +++ b/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java @@ -25,6 +25,7 @@ import reactor.core.publisher.Mono; import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; +import org.springframework.util.AntPathMatcher; import org.springframework.beans.factory.annotation.Qualifier; /** @@ -46,6 +47,7 @@ public class GlobalAuthWebFilter implements WebFilter { @Qualifier("reactiveRedisTemplate") private final ReactiveRedisTemplate redisTemplate; private final ObjectMapper objectMapper; + private final AntPathMatcher pathMatcher = new AntPathMatcher(); @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { @@ -121,27 +123,13 @@ public class GlobalAuthWebFilter implements WebFilter { return false; } for (String pattern : authProperties.getIgnorePaths()) { - if (matches(pattern, requestUri)) { + if (pathMatcher.match(pattern, requestUri)) { return true; } } return false; } - private boolean matches(String pattern, String uri) { - if (pattern.endsWith("/**")) { - String prefix = pattern.substring(0, pattern.length() - 3); - return uri.startsWith(prefix); - } - if (pattern.endsWith("/*")) { - String prefix = pattern.substring(0, pattern.length() - 2); - if (!uri.startsWith(prefix)) return false; - String suffix = uri.substring(prefix.length()); - return !suffix.contains("/"); - } - return uri.contains(pattern); - } - private Claims parseToken(String token) { SecretKey key = buildSigningKey(); return Jwts.parser() diff --git a/src/main/java/com/aida/gateway/route/RouteConfig.java b/src/main/java/com/aida/gateway/route/RouteConfig.java deleted file mode 100644 index 46725bc..0000000 --- a/src/main/java/com/aida/gateway/route/RouteConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.aida.gateway.route; - -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * 路由配置。 - *

- * 注意:实际生产环境中建议将路由配置放在 Nacos 配置中心。 - * StripPrefix=1 将 /seller 前缀剥离,例如: - * /seller/designer/check -> /designer/check (发到 aida-seller 的 /api/designer/check) - */ -@Configuration -public class RouteConfig { - - @Bean - public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { - return builder.routes() - // /internal/** 用于内部服务调用(如 logout 黑名单),不需要 stripPrefix - .route("aida-gateway-internal", r -> r - .path("/internal/**") - .uri("forward:/internal")) - // aida-seller 服务 - .route("aida-seller", r -> r - .path("/seller/**") - .filters(f -> f.stripPrefix(1)) - .uri("lb://aida-seller")) - // aida-back_001 服务 - .route("aida-back", r -> r - .path("/api/**") - .filters(f -> f.stripPrefix(1)) - .uri("lb://aida-back")) - .build(); - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 948d240..cd33cb6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -10,6 +10,24 @@ spring: application: name: aida-gateway +# ---------- Knife4j 网关聚合配置 ---------- +knife4j: + gateway: + enabled: true + # 手动指定下游服务的文档聚合,可以灵活应对不同服务的 API 版本或路径前缀 + strategy: manual + routes: + - name: 业务服务 (Back) + url: /api/v3/api-docs + service-name: aida-back + context-path: /api + order: 1 + - name: 商家端服务 (Seller) + url: /seller/api/v3/api-docs + service-name: aida-seller + context-path: /seller + order: 2 + # ---------- Gateway JWT 认证(gateway 独有) ---------- gateway: auth: @@ -21,11 +39,15 @@ gateway: - /favicon.ico - /doc.html - /swagger-ui.html + - /swagger-ui - /swagger-ui/** - /swagger-resources/** - /v2/api-docs + - /v2/api-docs/** + - /v3/api-docs - /v3/api-docs/** - /webjars/** + - /**/v3/api-docs/** - /api/account/login - /api/account/preLogin - /api/designer/check diff --git a/src/main/resources/bootstrap.yml b/src/main/resources/bootstrap.yml index fcafe5d..df0cde3 100644 --- a/src/main/resources/bootstrap.yml +++ b/src/main/resources/bootstrap.yml @@ -8,13 +8,13 @@ spring: application: name: aida-gateway config: - import: optional:nacos:aida-public-${NACOS_NAMESPACE:dev}.yml + import: optional:nacos:aida-public-${NACOS_NAMESPACE:test}.yml cloud: nacos: discovery: server-addr: ${NACOS_HOST:127.0.0.1:8848} - namespace: ${NACOS_NAMESPACE:dev} + namespace: ${NACOS_NAMESPACE:test} config: server-addr: ${NACOS_HOST:127.0.0.1:8848} - namespace: ${NACOS_NAMESPACE:dev} + namespace: ${NACOS_NAMESPACE:test} file-extension: yaml