From 7f06574ce9609c0d355691c7708fd4a050d39513 Mon Sep 17 00:00:00 2001
From: panxuejie <15855548138@163.com>
Date: Tue, 30 Dec 2025 16:48:44 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 16 +++
tacit-admin/pom.xml | 12 +-
tacit-admin/src/main/resources/bootstrap.yml | 3 +
tacit-app-api/pom.xml | 12 +-
.../src/main/resources/bootstrap.yml | 3 +
tacit-common/pom.xml | 41 ++++---
.../tacit/common/entity/ResponseResult.java | 4 +
tacit-gateway/pom.xml | 46 ++++----
.../filter/JwtAuthenticationFilter.java | 104 ++++++++++--------
.../src/main/resources/application-dev.yml | 50 ---------
.../src/main/resources/bootstrap.yml | 17 +--
11 files changed, 148 insertions(+), 160 deletions(-)
delete mode 100644 tacit-gateway/src/main/resources/application-dev.yml
diff --git a/pom.xml b/pom.xml
index 093d502..14bd0f0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,6 +29,8 @@
1.18.30
0.11.5
2.1.0
+ 2.3.0
+ 3.14.0
@@ -93,6 +95,20 @@
runtime
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ ${springdoc.version}
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
diff --git a/tacit-admin/pom.xml b/tacit-admin/pom.xml
index 3254316..c336b1a 100644
--- a/tacit-admin/pom.xml
+++ b/tacit-admin/pom.xml
@@ -34,16 +34,6 @@
spring-cloud-starter-loadbalancer
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-discovery
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-config
-
-
com.baomidou
@@ -61,7 +51,6 @@
org.springdoc
springdoc-openapi-starter-webmvc-ui
- 2.3.0
@@ -75,6 +64,7 @@
org.projectlombok
lombok
+ ${lombok.version}
provided
diff --git a/tacit-admin/src/main/resources/bootstrap.yml b/tacit-admin/src/main/resources/bootstrap.yml
index 4e12c8e..99fea7f 100644
--- a/tacit-admin/src/main/resources/bootstrap.yml
+++ b/tacit-admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,9 @@
spring:
application:
name: tacit-admin
+ config:
+ import:
+ - nacos: # 添加此行
cloud:
nacos:
discovery:
diff --git a/tacit-app-api/pom.xml b/tacit-app-api/pom.xml
index 3f4b5b2..8489c1f 100644
--- a/tacit-app-api/pom.xml
+++ b/tacit-app-api/pom.xml
@@ -34,16 +34,6 @@
spring-cloud-starter-loadbalancer
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-discovery
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-config
-
-
com.baomidou
@@ -61,7 +51,6 @@
org.springdoc
springdoc-openapi-starter-webmvc-ui
- 2.3.0
@@ -75,6 +64,7 @@
org.projectlombok
lombok
+ ${lombok.version}
provided
diff --git a/tacit-app-api/src/main/resources/bootstrap.yml b/tacit-app-api/src/main/resources/bootstrap.yml
index ad0ac67..aa5741e 100644
--- a/tacit-app-api/src/main/resources/bootstrap.yml
+++ b/tacit-app-api/src/main/resources/bootstrap.yml
@@ -1,6 +1,9 @@
spring:
application:
name: tacit-app-api
+ config:
+ import:
+ - nacos: # 添加此行
cloud:
nacos:
discovery:
diff --git a/tacit-common/pom.xml b/tacit-common/pom.xml
index 8b822a7..ca11c9a 100644
--- a/tacit-common/pom.xml
+++ b/tacit-common/pom.xml
@@ -20,16 +20,6 @@
spring-boot-starter-web
-
-
- org.springframework.cloud
- spring-cloud-starter-openfeign
-
-
- org.springframework.cloud
- spring-cloud-starter-loadbalancer
-
-
com.alibaba.cloud
@@ -40,17 +30,16 @@
spring-cloud-starter-alibaba-nacos-config
-
+
- com.baomidou
- mybatis-plus-boot-starter
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
-
+
- com.oceanbase
- oceanbase-client
- 2.4.0
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
@@ -81,6 +70,24 @@
org.springframework.boot
spring-boot-starter-validation
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
diff --git a/tacit-common/src/main/java/com/tacit/common/entity/ResponseResult.java b/tacit-common/src/main/java/com/tacit/common/entity/ResponseResult.java
index 4298c3a..a4db039 100644
--- a/tacit-common/src/main/java/com/tacit/common/entity/ResponseResult.java
+++ b/tacit-common/src/main/java/com/tacit/common/entity/ResponseResult.java
@@ -44,4 +44,8 @@ public class ResponseResult implements Serializable {
public static ResponseResult fail(Integer code, String message) {
return new ResponseResult<>(code, message, null);
}
+
+ public boolean isSuccess() {
+ return this.code == 200;
+ }
}
diff --git a/tacit-gateway/pom.xml b/tacit-gateway/pom.xml
index 222831d..3029dc2 100644
--- a/tacit-gateway/pom.xml
+++ b/tacit-gateway/pom.xml
@@ -20,16 +20,6 @@
spring-cloud-starter-gateway
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-discovery
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-config
-
-
org.springframework.boot
@@ -41,26 +31,33 @@
com.tacit
tacit-common
${project.parent.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
org.projectlombok
lombok
+ ${lombok.version}
provided
-
-
- org.apache.commons
- commons-lang3
- 3.14.0
-
-
-
+
org.springframework.boot
- spring-boot-starter-logging
+ spring-boot-starter-test
+ test
@@ -72,7 +69,18 @@
${spring-boot.version}
false
+ com.tacit.gateway.GatewayApplication
+
+
+
+ repackage
+
+
+ com.tacit.gateway.GatewayApplication
+
+
+
diff --git a/tacit-gateway/src/main/java/com/tacit/gateway/filter/JwtAuthenticationFilter.java b/tacit-gateway/src/main/java/com/tacit/gateway/filter/JwtAuthenticationFilter.java
index cf0b9c6..5c7bdf1 100644
--- a/tacit-gateway/src/main/java/com/tacit/gateway/filter/JwtAuthenticationFilter.java
+++ b/tacit-gateway/src/main/java/com/tacit/gateway/filter/JwtAuthenticationFilter.java
@@ -4,8 +4,10 @@ import com.tacit.common.constant.CommonConstant;
import com.tacit.common.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
@@ -17,9 +19,12 @@ import reactor.core.publisher.Mono;
import java.util.List;
-@Component
+/**
+ * JWT 认证过滤器 - 作为 GatewayFilterFactory 使用
+ */
+@Component("JwtAuthenticationFilter")
@Slf4j
-public class JwtAuthenticationFilter implements GlobalFilter, Ordered {
+public class JwtAuthenticationFilter extends AbstractGatewayFilterFactory {
// 不需要认证的路径
private static final List WHITE_LIST = List.of(
@@ -29,54 +34,63 @@ public class JwtAuthenticationFilter implements GlobalFilter, Ordered {
"/v3/api-docs"
);
+ public JwtAuthenticationFilter() {
+ super(Config.class);
+ }
+
@Override
- public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
- ServerHttpRequest request = exchange.getRequest();
- String path = request.getURI().getPath();
+ public GatewayFilter apply(Config config) {
+ return new GatewayFilter() {
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ ServerHttpRequest request = exchange.getRequest();
+ String path = request.getURI().getPath();
- // 检查是否在白名单中
- if (isWhiteList(path)) {
- return chain.filter(exchange);
- }
+ // 检查是否在白名单中
+ if (isWhiteList(path)) {
+ return chain.filter(exchange);
+ }
- // 获取Authorization头
- HttpHeaders headers = request.getHeaders();
- String authorization = headers.getFirst(HttpHeaders.AUTHORIZATION);
+ // 获取Authorization头
+ HttpHeaders headers = request.getHeaders();
+ String authorization = headers.getFirst(HttpHeaders.AUTHORIZATION);
- // 检查Authorization头是否存在
- if (StringUtils.isBlank(authorization)) {
- return unauthorizedResponse(exchange, "缺少认证令牌");
- }
+ // 检查Authorization头是否存在
+ if (StringUtils.isBlank(authorization)) {
+ return unauthorizedResponse(exchange, "缺少认证令牌");
+ }
- // 检查Authorization头格式
- if (!authorization.startsWith(CommonConstant.JWT_PREFIX)) {
- return unauthorizedResponse(exchange, "认证令牌格式错误");
- }
+ // 检查Authorization头格式
+ if (!authorization.startsWith(CommonConstant.JWT_PREFIX)) {
+ return unauthorizedResponse(exchange, "认证令牌格式错误");
+ }
- // 提取JWT令牌
- String token = authorization.substring(CommonConstant.JWT_PREFIX.length());
+ // 提取JWT令牌
+ String token = authorization.substring(CommonConstant.JWT_PREFIX.length());
- // 验证JWT令牌
- try {
- JwtUtils.validateToken(token);
-
- // 从令牌中获取用户信息并添加到请求头
- Long userId = JwtUtils.getUserIdFromToken(token);
- String username = JwtUtils.getUsernameFromToken(token);
- String role = JwtUtils.getRoleFromToken(token);
+ // 验证JWT令牌
+ try {
+ JwtUtils.validateToken(token);
+
+ // 从令牌中获取用户信息并添加到请求头
+ Long userId = JwtUtils.getUserIdFromToken(token);
+ String username = JwtUtils.getUsernameFromToken(token);
+ String role = JwtUtils.getRoleFromToken(token);
- // 将用户信息添加到请求头
- ServerHttpRequest mutatedRequest = request.mutate()
- .header("X-User-Id", String.valueOf(userId))
- .header("X-Username", username)
- .header("X-Role", role)
- .build();
+ // 将用户信息添加到请求头
+ ServerHttpRequest mutatedRequest = request.mutate()
+ .header("X-User-Id", String.valueOf(userId))
+ .header("X-Username", username)
+ .header("X-Role", role)
+ .build();
- return chain.filter(exchange.mutate().request(mutatedRequest).build());
- } catch (Exception e) {
- log.error("JWT认证失败: {}", e.getMessage());
- return unauthorizedResponse(exchange, e.getMessage());
- }
+ return chain.filter(exchange.mutate().request(mutatedRequest).build());
+ } catch (Exception e) {
+ log.error("JWT认证失败: {}", e.getMessage());
+ return unauthorizedResponse(exchange, e.getMessage());
+ }
+ }
+ };
}
/**
@@ -97,8 +111,8 @@ public class JwtAuthenticationFilter implements GlobalFilter, Ordered {
return response.writeWith(Mono.just(response.bufferFactory().wrap(responseBody.getBytes())));
}
- @Override
- public int getOrder() {
- return -100;
+
+ public static class Config {
+ // 可以添加配置属性
}
-}
+}
\ No newline at end of file
diff --git a/tacit-gateway/src/main/resources/application-dev.yml b/tacit-gateway/src/main/resources/application-dev.yml
deleted file mode 100644
index df67938..0000000
--- a/tacit-gateway/src/main/resources/application-dev.yml
+++ /dev/null
@@ -1,50 +0,0 @@
-server:
- port: 8080
-
-spring:
- cloud:
- gateway:
- discovery:
- locator:
- enabled: true
- lower-case-service-id: true
- routes:
- # Admin Service Route
- - id: tacit-admin
- uri: lb://tacit-admin
- predicates:
- - Path=/admin/**
- filters:
- - StripPrefix=1
-
- # App API Service Route
- - id: tacit-app-api
- uri: lb://tacit-app-api
- predicates:
- - Path=/api/**
- filters:
- - StripPrefix=1
- - JwtAuthenticationFilter
-
- # Swagger UI Routes
- - id: swagger-admin
- uri: lb://tacit-admin
- predicates:
- - Path=/swagger-admin/**
- filters:
- - StripPrefix=1
-
- - id: swagger-app-api
- uri: lb://tacit-app-api
- predicates:
- - Path=/swagger-app-api/**
- filters:
- - StripPrefix=1
-
-# Logging Configuration
-logging:
- level:
- org.springframework.cloud.gateway: debug
- org.springframework.http.server.reactive: debug
- org.springframework.web.reactive: debug
- reactor.netty: debug
diff --git a/tacit-gateway/src/main/resources/bootstrap.yml b/tacit-gateway/src/main/resources/bootstrap.yml
index 0df105b..575ef3d 100644
--- a/tacit-gateway/src/main/resources/bootstrap.yml
+++ b/tacit-gateway/src/main/resources/bootstrap.yml
@@ -1,16 +1,19 @@
spring:
application:
name: tacit-gateway
+ main:
+ web-application-type: reactive
cloud:
nacos:
discovery:
+ enabled: true
server-addr: localhost:8848
- namespace: public
+ username: nacos
+ password: nacos
config:
+ enabled: true
server-addr: localhost:8848
- namespace: public
- file-extension: yml
- group: DEFAULT_GROUP
- refresh-enabled: true
- profiles:
- active: dev
+ file-extension: yaml
+ username: nacos
+ password: nacos
+