浏览代码

修改token请求方法,解决数据中台访问报错问题

Lin Qilong 1 月之前
父节点
当前提交
d004428c5e

+ 9 - 2
src/main/java/cn/com/goldenwater/domain/GatewayRoutes.java

@@ -11,18 +11,23 @@ import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 @Data
 @TableName
 public class GatewayRoutes implements Serializable {
 
     private String id;
+
     private String serviceName;
+
     private String uri;
+
     private String predicates;
+
     private String filters;
+
     private String status;
+
     /**
      * 响应成功格式
      */
@@ -34,6 +39,9 @@ public class GatewayRoutes implements Serializable {
 
     private String authExpirationTime;
 
+    private String tokenLocation;
+
+    private String tokenKey;
 
     public List<PredicateDefinition> getPredicateDefinition() {
         if (this.predicates != null) {
@@ -67,7 +75,6 @@ public class GatewayRoutes implements Serializable {
         }
     }
 
-
     public JSONObject getResultSuccessFormatData() {
         if (StringUtils.isNoneBlank(this.resultSuccessFormat)) {
             return JsonUtils.jsonToPojo(this.resultSuccessFormat, JSONObject.class);

+ 7 - 16
src/main/java/cn/com/goldenwater/filter/ApiAuthFilter.java

@@ -4,7 +4,6 @@ import cn.com.goldenwater.service.AuditService;
 import cn.com.goldenwater.service.PermissionService;
 import cn.com.goldenwater.service.PtAppService;
 import cn.com.goldenwater.utils.JsonUtils;
-import cn.com.goldenwater.utils.TokenUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
 import org.springframework.cloud.gateway.filter.GlobalFilter;
@@ -19,6 +18,7 @@ import reactor.core.publisher.Mono;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 
 @Component
 public class ApiAuthFilter implements GlobalFilter, Ordered {
@@ -38,24 +38,15 @@ public class ApiAuthFilter implements GlobalFilter, Ordered {
         String path = request.getPath().value();
         String method = request.getMethodValue();
 
-        // 从exchange属性中获取已经在AuthFilter中解析的token
-        String token = (String) exchange.getAttribute("AUTH_TOKEN");
-        if (token == null) {
-            // 如果没有获取到token,则从请求头中获取
-            token = TokenUtils.getTokenFromRequest(request);
-        }
-
-        // 获取第三方服务ID
-//        String thirdPartyId = jwtTokenProvider.getAppId(token);
-        String thirdPartyId = ptAppService.getAppIdByAppToken(token);
-
+        // 获取 第三方服务ID
+        String token = exchange.getAttribute("AUTH_TOKEN");
+        String thirdPartyId = Optional.ofNullable(token).map(t -> ptAppService.getAppIdByAppToken(token)).orElse(null);
         if (thirdPartyId == null) {
-            return forbidden(exchange, "Invalid third-party identity");
+//            return forbidden(exchange, "Invalid third-party identity");
+        } else {
+            exchange.getAttributes().put("THIRD_PARTY_ID", thirdPartyId);
         }
 
-        // 将 thirdPartyId 存储到exchange属性中
-        exchange.getAttributes().put("THIRD_PARTY_ID", thirdPartyId);
-
         // 检查权限
         return permissionService.checkPermission(thirdPartyId, path, method)
                 .flatMap(hasPermission -> {

+ 3 - 4
src/main/java/cn/com/goldenwater/filter/AuthFilter.java

@@ -40,11 +40,10 @@ public class AuthFilter implements GlobalFilter, Ordered {
         // 获取访问令牌
         String token = TokenUtils.getTokenFromRequest(request);
         if (token == null) {
-            return unauthorized(exchange, "Missing access token");
+//            return unauthorized(exchange, "Missing access token");
+        } else {
+            exchange.getAttributes().put("AUTH_TOKEN", token);
         }
-        
-        // 将token存储到exchange属性中
-        exchange.getAttributes().put("AUTH_TOKEN", token);
 
         // 验证令牌
         return authService.validateToken(token)

+ 0 - 6
src/main/java/cn/com/goldenwater/filter/RateLimitFilter.java

@@ -23,12 +23,6 @@ import java.util.Map;
 @Component
 public class RateLimitFilter implements GlobalFilter, Ordered {
 
-    @Autowired
-    private JwtTokenProvider jwtTokenProvider;
-
-    @Autowired
-    private PtAppService ptAppService;
-
     @Autowired
     private RateLimiterService rateLimiterService;
 

+ 10 - 14
src/main/java/cn/com/goldenwater/filter/ResponseLogGlobalFilter.java

@@ -1,6 +1,5 @@
 package cn.com.goldenwater.filter;
 
-import cn.com.goldenwater.domain.PtApp;
 import cn.com.goldenwater.domain.PtService;
 import cn.com.goldenwater.domain.PtServiceLog;
 import cn.com.goldenwater.service.PtAppService;
@@ -30,10 +29,7 @@ import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Slf4j
 @Configuration
@@ -204,18 +200,18 @@ public class ResponseLogGlobalFilter implements GlobalFilter, Ordered {
                 serviceLog.setServiceName("未找到服务信息");
             }
 
-            // 获取第三方服务ID
-            String thirdPartyId = (String) exchange.getAttribute("THIRD_PARTY_ID");
-            PtApp ptApp = ptAppService.getById(thirdPartyId);
-            if (ptApp != null) {
-                serviceLog.setUserId(ptApp.getUserId());
-                serviceLog.setAppId(ptApp.getAppId());
-                serviceLog.setAppName(ptApp.getAppName());
-            }
+            // 记录应用信息
+            String thirdPartyId = exchange.getAttribute("THIRD_PARTY_ID");
+            Optional.ofNullable(thirdPartyId)
+                    .map(id -> ptAppService.getById(id))
+                    .ifPresent(ptApp -> {
+                        serviceLog.setUserId(ptApp.getUserId());
+                        serviceLog.setAppId(ptApp.getAppId());
+                        serviceLog.setAppName(ptApp.getAppName());
+                    });
 
             // 异步保存日志
             ptServiceLogService.save(serviceLog);
-
             // 判断是否记录报警信息
             ptServiceAlarmService.saveByLog(serviceLog, responseContent, gatewayUrl);
         } catch (Exception e) {

+ 33 - 12
src/main/java/cn/com/goldenwater/filter/ThirdPartyAuthFilter.java

@@ -23,6 +23,8 @@ import java.util.concurrent.TimeUnit;
 public class ThirdPartyAuthFilter implements GlobalFilter, Ordered {
 
     private static final String THIRD_PARTY_AUTH = "third_party_auth";
+    private static final String TOKEN_LOCATION_HEADER = "header";
+    private static final String TOKEN_LOCATION_QUERY = "query";
 
     @Autowired
     private RedisCache redisCache;
@@ -52,22 +54,41 @@ public class ThirdPartyAuthFilter implements GlobalFilter, Ordered {
                 redisCache.setCacheObject(key, thirdPartyAuthToken, Integer.parseInt(gatewayRoutes.getAuthExpirationTime()), TimeUnit.MINUTES);
             }
 
-            // 构建新的请求并将access_token添加到查询参数中
+            // 根据配置确定token键名,默认为access_token
+            String tokenKey = StringUtils.isNotBlank(gatewayRoutes.getTokenKey()) ? 
+                              gatewayRoutes.getTokenKey() : "access_token";
+            
             ServerHttpRequest request = exchange.getRequest();
-            URI uri = UriComponentsBuilder.fromUri(request.getURI())
-                    .queryParam("access_token", thirdPartyAuthToken)
-                    .build(true)
-                    .toUri();
+            
+            // 根据tokenLocation配置决定将token添加到哪里
+            if (TOKEN_LOCATION_HEADER.equals(gatewayRoutes.getTokenLocation())) {
+                // 添加到请求头
+                ServerHttpRequest modifiedRequest = request.mutate()
+                        .header(tokenKey, thirdPartyAuthToken)
+                        .build();
+                
+                ServerWebExchange modifiedExchange = exchange.mutate()
+                        .request(modifiedRequest)
+                        .build();
+                        
+                return chain.filter(modifiedExchange);
+            } else {
+                // 默认添加到查询参数
+                URI uri = UriComponentsBuilder.fromUri(request.getURI())
+                        .queryParam(tokenKey, thirdPartyAuthToken)
+                        .build(true)
+                        .toUri();
 
-            ServerHttpRequest modifiedRequest = request.mutate()
-                    .uri(uri)
-                    .build();
+                ServerHttpRequest modifiedRequest = request.mutate()
+                        .uri(uri)
+                        .build();
 
-            ServerWebExchange modifiedExchange = exchange.mutate()
-                    .request(modifiedRequest)
-                    .build();
+                ServerWebExchange modifiedExchange = exchange.mutate()
+                        .request(modifiedRequest)
+                        .build();
 
-            return chain.filter(modifiedExchange);
+                return chain.filter(modifiedExchange);
+            }
         }
 
         return chain.filter(exchange);

+ 6 - 6
src/main/java/cn/com/goldenwater/service/impl/AuthServiceImpl.java

@@ -41,12 +41,12 @@ public class AuthServiceImpl implements AuthService {
 //                return Mono.just(false);
 //            }
 
-            QueryWrapper<PtApp> queryWrapper = new QueryWrapper<>();
-            queryWrapper.eq("app_secret", token);
-            PtApp ptApp = ptAppService.getOne(queryWrapper);
-            if (ptApp == null) {
-                return Mono.just(false);
-            }
+//            QueryWrapper<PtApp> queryWrapper = new QueryWrapper<>();
+//            queryWrapper.eq("app_secret", token);
+//            PtApp ptApp = ptAppService.getOne(queryWrapper);
+//            if (ptApp == null) {
+//                return Mono.just(false);
+//            }
 
             // token有效
             return Mono.just(true);

+ 3 - 2
src/main/java/cn/com/goldenwater/utils/TokenUtils.java

@@ -1,12 +1,13 @@
 package cn.com.goldenwater.utils;
 
-import org.springframework.http.HttpHeaders;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 
 public class TokenUtils {
 
+    private final static String AUTHORIZATION = "ModelAuth";
+
     public static String getTokenFromRequest(ServerHttpRequest request) {
-        String authHeader = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
+        String authHeader = request.getHeaders().getFirst(AUTHORIZATION);
 //        if (authHeader != null && authHeader.startsWith("Bearer ")) {
 //            return authHeader.substring(7);
 //        }