Răsfoiți Sursa

feat: 从请求头 token 获取 userId 并回填到请求头中,方便后续模块获取

liangke 3 ani în urmă
părinte
comite
1edb072a10

+ 4 - 0
pom.xml

@@ -73,6 +73,10 @@
             <groupId>com.github.ben-manes.caffeine</groupId>
             <artifactId>caffeine</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-oauth2-jose</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

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

@@ -0,0 +1,44 @@
+package com.inspur.smsb.gateway.filter;
+
+import com.google.common.base.Strings;
+import com.nimbusds.jose.JWSObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.text.ParseException;
+
+/**
+ * 过滤器,在请求头中解析 JWT 字段,并解析出 userId 回填
+ *
+ * @author liangke
+ */
+@Slf4j
+@Component
+public class WebFluxUserRequestInfoFilter implements GlobalFilter {
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        try {
+            String token = exchange.getRequest().getHeaders().getFirst("Authorization");
+            if (Strings.isNullOrEmpty(token)) {
+                return chain.filter(exchange);
+            }
+            String realToken = token.replace("Bearer ", "");
+            JWSObject jwsObject = JWSObject.parse(realToken);
+
+            ServerHttpRequest request = exchange.getRequest()
+                .mutate()
+                .header("userId", String.valueOf(jwsObject.getPayload().toJSONObject().get("sub")))
+                .build();
+            // 把新的 exchange 放回到过滤链
+            return chain.filter(exchange.mutate().request(request).build());
+        } catch (ParseException e) {
+            log.error(e.getMessage(), e);
+            return chain.filter(exchange);
+        }
+    }
+}