cors配置
This commit is contained in:
@@ -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 -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user