diff --git a/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java b/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java index cc5e65a..eace5de 100644 --- a/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java +++ b/src/main/java/com/aida/gateway/filter/GlobalAuthWebFilter.java @@ -32,11 +32,12 @@ import org.springframework.beans.factory.annotation.Qualifier; * Gateway 全局鉴权过滤器。 *

* 流程: - * 1. 白名单路径直接放行 - * 2. 从请求头读取 JWT,验证签名和有效期 - * 3. 检查 Redis 黑名单(logout 后 token 被拉黑) - * 4. 将用户 ID 和用户信息 JSON 写入下游请求头 - * 5. 失败返回 401 JSON + * 1. 放过 OPTIONS 预检请求,由全局 CORS 配置处理 + * 2. 白名单路径直接放行 + * 3. 从请求头读取 JWT,验证签名和有效期 + * 4. 检查 Redis 黑名单(logout 后 token 被拉黑) + * 5. 将用户 ID 和用户信息 JSON 写入下游请求头 + * 6. 失败返回 401 JSON */ @Slf4j @Component @@ -53,12 +54,17 @@ public class GlobalAuthWebFilter implements WebFilter { public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); - // 1. 白名单直接放行 + // 1. 放过 OPTIONS 预检请求,由全局 CORS 配置处理 + if ("OPTIONS".equalsIgnoreCase(exchange.getRequest().getMethod().name())) { + return chain.filter(exchange); + } + + // 2. 白名单直接放行 if (isIgnoredPath(path)) { return chain.filter(exchange); } - // 2. 提取 token + // 3. 提取 token String rawHeader = exchange.getRequest().getHeaders() .getFirst(authProperties.getJwtTokenHeader()); if (StrUtil.isBlank(rawHeader)) { @@ -70,7 +76,7 @@ public class GlobalAuthWebFilter implements WebFilter { token = rawHeader.substring(authProperties.getJwtTokenPrefix().length()); } - // 3. JWT 签名验证 + // 4. JWT 签名验证 Claims claims; try { claims = parseToken(token); @@ -79,7 +85,7 @@ public class GlobalAuthWebFilter implements WebFilter { return writeUnauthorized(exchange, AuthConstants.MSG_TOKEN_EXPIRED); } - // 4. 解析用户信息 + // 5. 解析用户信息 AuthPrincipalVo principal; try { principal = objectMapper.readValue(claims.getSubject(), AuthPrincipalVo.class); @@ -92,7 +98,7 @@ public class GlobalAuthWebFilter implements WebFilter { return writeUnauthorized(exchange, AuthConstants.MSG_INVALID_TOKEN); } - // 5. 黑名单检查(仅当启用时) + // 6. 黑名单检查(仅当启用时) if (authProperties.isBlacklistEnabled()) { String blacklistKey = AuthConstants.BLACKLIST_PREFIX + principal.getId(); return redisTemplate.hasKey(blacklistKey).flatMap(isBlacklisted -> {