2424import java .nio .charset .StandardCharsets ;
2525
2626/**
27- * 鉴权过滤器
27+ * 用户数据隔离过滤器
2828 *
29+ * 支持两种认证模式:
30+ * 1. SSO 模式:从 OmsAuthFilter 添加的 X-User-Name header 中提取用户信息
31+ * 2. JWT 模式:从 Authorization Bearer Token 中提取用户信息
32+ *
33+ * 无论哪种模式,最终都会添加 User header 供下游服务隔离用户数据
34+ *
35+ * 优先级:SSO > JWT
36+ * Order: 2 (低于 OmsAuthFilter 的 Order=1)
37+ *
38+ * @author songyongtan
39+ * @date 2026-03-30
2940 */
3041@ Slf4j
3142@ Component
@@ -49,34 +60,55 @@ public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
4960 if (path .equals ("/api/user/login" ) || path .equals ("/api/user/signup" )) {
5061 return chain .filter (exchange );
5162 }
63+
5264 try {
65+ // 优先检查 SSO 模式(OmsAuthFilter 已添加的 header)
66+ String ssoUser = request .getHeaders ().getFirst ("X-User-Name" );
67+ if (StringUtils .isNotBlank (ssoUser )) {
68+ log .info ("SSO mode detected, adding User header: {}" , ssoUser );
69+ ServerHttpRequest mutatedRequest = request .mutate ()
70+ .headers (httpHeaders -> {
71+ httpHeaders .add (USER_HEADER , ssoUser );
72+ })
73+ .build ();
74+ ServerWebExchange mutatedExchange = exchange .mutate ()
75+ .request (mutatedRequest )
76+ .build ();
77+ return chain .filter (mutatedExchange );
78+ }
79+
80+ // 检查 JWT 模式
5381 if (!jwtEnable ) {
82+ log .debug ("JWT is disabled, passing request without user header" );
5483 return chain .filter (exchange );
5584 }
56- // Get token from Authorization header
85+
86+ // JWT 模式:验证 Token
5787 String authHeader = request .getHeaders ().getFirst (AUTH_HEADER );
5888 if (authHeader == null || !authHeader .startsWith (TOKEN_PREFIX )) {
89+ log .warn ("JWT enabled but no valid Authorization header found" );
5990 return sendUnauthorizedResponse (exchange );
6091 }
92+
6193 String token = authHeader .substring (TOKEN_PREFIX .length ());
6294 String user = userService .validateToken (token );
6395 if (StringUtils .isBlank (user )) {
96+ log .warn ("JWT token validation failed" );
6497 return sendUnauthorizedResponse (exchange );
6598 }
66- // 4. 创建新的请求
99+
100+ log .info ("JWT mode authenticated, adding User header: {}" , user );
67101 ServerHttpRequest mutatedRequest = request .mutate ()
68102 .headers (httpHeaders -> {
69- // 或者直接操作headers
70103 httpHeaders .add (USER_HEADER , user );
71104 })
72105 .build ();
73- // 5. 使用新的请求创建新的exchange
74106 ServerWebExchange mutatedExchange = exchange .mutate ()
75107 .request (mutatedRequest )
76108 .build ();
77109 return chain .filter (mutatedExchange );
78110 } catch (Exception e ) {
79- log .error ("get current user info error " , e );
111+ log .error ("Error in AuthFilter " , e );
80112 return sendUnauthorizedResponse (exchange );
81113 }
82114 }
@@ -98,9 +130,12 @@ private Mono<Void> sendUnauthorizedResponse(ServerWebExchange exchange) {
98130 }
99131
100132 /**
101- * JWT 认证优先级低于 SSO
133+ * 用户数据隔离过滤器优先级
134+ *
135+ * Order = 2,在 OmsAuthFilter (Order=1) 之后执行
136+ * 确保先执行 SSO 认证,再执行用户数据隔离
102137 *
103- * @return order value (2 = lower priority than SSO filter )
138+ * @return order value (2 = after SSO authentication )
104139 */
105140 @ Override
106141 public int getOrder () {
0 commit comments