cors配置

This commit is contained in:
litianxiang
2026-05-05 15:57:35 +08:00
parent edb0c01ec0
commit 89e6bda78d

View File

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