Quellcode durchsuchen

feat: 网关增加统管鉴权

lijiaqi vor 1 Jahr
Ursprung
Commit
0b64aef9a0

+ 5 - 0
pom.xml

@@ -112,6 +112,11 @@
             <artifactId>commons-httpclient</artifactId>
             <version>3.1</version>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-jwt</artifactId>
+            <version>5.8.12</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 15 - 0
src/main/java/com/inspur/smsb/gateway/filter/WebFluxUserRequestInfoFilter.java

@@ -11,6 +11,7 @@ import com.inspur.smsb.gateway.config.AnonymousPathProperties;
 import com.inspur.smsb.gateway.dto.KeycloakGroupsDto;
 import com.inspur.smsb.gateway.dto.KeycloakUserDto;
 import com.inspur.smsb.gateway.utils.HttpClientUtil;
+import com.inspur.smsb.gateway.utils.TokenParseUtil;
 import com.nimbusds.jose.JWSObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -58,6 +59,7 @@ public class WebFluxUserRequestInfoFilter implements GlobalFilter {
     private String adminUserId;
     private static final String ROLE_SUPER_ADMIN = "ROLE_SUPER_ADMIN";
     private static final String ROLE_ADMIN = "ROLE_ADMIN";
+    private static final String UNIFIED_TOKEN_HEADER = "UnifiedToken";
 
     @Value("${wxapplet.secret}")
     private String secret;
@@ -189,6 +191,10 @@ public class WebFluxUserRequestInfoFilter implements GlobalFilter {
                     if (isWxAppletRequest(exchange.getRequest()) && isEncryptedRequest(exchange.getRequest())) {
                         return chain.filter(exchange);
                     }
+                    // 统管token鉴权
+                    if (isValidUnifiedRequest(exchange.getRequest())) {
+                        return chain.filter(exchange);
+                    }
                     exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
                     return exchange.getResponse().setComplete();
                 }
@@ -285,6 +291,15 @@ public class WebFluxUserRequestInfoFilter implements GlobalFilter {
         }
     }
 
+    private boolean isValidUnifiedRequest(ServerHttpRequest request) {
+        String jwtToken = request.getHeaders().getFirst(UNIFIED_TOKEN_HEADER);
+        if (!StringUtils.hasText(jwtToken)) {
+            return false;
+        }
+
+        return TokenParseUtil.verityToken(jwtToken);
+    }
+
     /**
      * 无权限访问
      */

+ 19 - 0
src/main/java/com/inspur/smsb/gateway/utils/TokenParseUtil.java

@@ -0,0 +1,19 @@
+package com.inspur.smsb.gateway.utils;
+
+import cn.hutool.jwt.JWTUtil;
+
+/**
+ * @author lijiaqi
+ * @date 2024-07-03 09:17
+ */
+public class TokenParseUtil {
+
+    /**
+     * @see com.inspur.device.client.unified.UnifiedManageAuthStrategy#PUBLIC_KEY
+     * */
+    public static final String PUBLIC_KEY = "MIIBIjANBgkqhk";
+
+    public static boolean verityToken(String token) {
+        return JWTUtil.verify(token, PUBLIC_KEY.getBytes());
+    }
+}