bugfix:网关token移除login-user头信息后重新赋值引用

(cherry picked from commit 3abfd365693361e27d8ab193959b2162d1b4347a)
This commit is contained in:
司徒俊杰 2025-04-14 14:01:20 +00:00 committed by dengqichen
parent d1c204e11d
commit 58a38d0302

View File

@ -81,9 +81,9 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered {
}
@Override
public Mono<Void> filter(final ServerWebExchange exchange, GatewayFilterChain chain) {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 移除 login-user 的请求头避免伪造模拟
SecurityFrameworkUtils.removeLoginUser(exchange);
exchange = SecurityFrameworkUtils.removeLoginUser(exchange);
// 情况一如果没有 Token 令牌则直接继续 filter
String token = SecurityFrameworkUtils.obtainAuthorization(exchange);
@ -93,17 +93,18 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered {
// 情况二如果有 Token 令牌则解析对应 userIduserTypetenantId 等字段并通过 通过 Header 转发给服务
// 重要说明defaultIfEmpty 作用保证 Mono.empty() 情况可以继续执行 `flatMap chain.filter(exchange)` 逻辑避免返回给前端空的 Response
ServerWebExchange finalExchange = exchange;
return getLoginUser(exchange, token).defaultIfEmpty(LOGIN_USER_EMPTY).flatMap(user -> {
// 1. 无用户直接 filter 继续请求
if (user == LOGIN_USER_EMPTY || // 下面 expiresTime 的判断为了解决 token 实际已经过期的情况
user.getExpiresTime() == null || LocalDateTimeUtils.beforeNow(user.getExpiresTime())) {
return chain.filter(exchange);
return chain.filter(finalExchange);
}
// 2.1 有用户则设置登录用户
SecurityFrameworkUtils.setLoginUser(exchange, user);
SecurityFrameworkUtils.setLoginUser(finalExchange, user);
// 2.2 user 并设置到 login-user 的请求头使用 json 存储值
ServerWebExchange newExchange = exchange.mutate()
ServerWebExchange newExchange = finalExchange.mutate()
.request(builder -> SecurityFrameworkUtils.setLoginUserHeader(builder, user)).build();
return chain.filter(newExchange);
});