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 +