提交 1b84f3f1 authored 作者: YunaiV's avatar YunaiV

bugfix:解决用户 Token 过期时,因为 Mono.empty() 导致返回空的 Response 的问题

上级 f1cf5f9f
...@@ -34,9 +34,19 @@ import java.util.function.Function; ...@@ -34,9 +34,19 @@ import java.util.function.Function;
@Component @Component
public class TokenAuthenticationFilter implements GlobalFilter, Ordered { public class TokenAuthenticationFilter implements GlobalFilter, Ordered {
/**
* CommonResult<OAuth2AccessTokenCheckRespDTO> 对应的 TypeReference 结果,用于解析 checkToken 的结果
*/
private static final TypeReference<CommonResult<OAuth2AccessTokenCheckRespDTO>> CHECK_RESULT_TYPE_REFERENCE private static final TypeReference<CommonResult<OAuth2AccessTokenCheckRespDTO>> CHECK_RESULT_TYPE_REFERENCE
= new TypeReference<CommonResult<OAuth2AccessTokenCheckRespDTO>>() {}; = new TypeReference<CommonResult<OAuth2AccessTokenCheckRespDTO>>() {};
/**
* 空的 LoginUser 的结果
*
* TODO 芋艿:用于解决 getLoginUser 返回 Mono.empty() 的时候,会导致后续的 flatMap 无法进行处理的问题。先暂时这么解决,寻找更优解 ing
*/
private static final LoginUser LOGIN_USER_EMPTY = new LoginUser();
private final WebClient webClient; private final WebClient webClient;
/** /**
...@@ -76,14 +86,18 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered { ...@@ -76,14 +86,18 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered {
} }
// 情况二,如果有 Token 令牌,则解析对应 userId、userType、tenantId 等字段,并通过 通过 Header 转发给服务 // 情况二,如果有 Token 令牌,则解析对应 userId、userType、tenantId 等字段,并通过 通过 Header 转发给服务
return getLoginUser(exchange, token).flatMap(user -> { // 重要说明:defaultIfEmpty 作用,保证 Mono.empty() 情况,可以继续执行 `flatMap 的 chain.filter(exchange)` 逻辑,避免返回给前端空的 Response!!
if (user == null) { return getLoginUser(exchange, token).defaultIfEmpty(LOGIN_USER_EMPTY).flatMap(user -> {
// 1. 无用户,直接 filter 继续请求
if (user == LOGIN_USER_EMPTY) {
return chain.filter(exchange); return chain.filter(exchange);
} }
// 设置登录用户
// 2.1 有用户,则设置登录用户
SecurityFrameworkUtils.setLoginUser(exchange, user); SecurityFrameworkUtils.setLoginUser(exchange, user);
// 将 user 并设置到 login-user 的请求头,使用 json 存储值 // 2.2 将 user 并设置到 login-user 的请求头,使用 json 存储值
ServerWebExchange newExchange = exchange.mutate().request(builder -> SecurityFrameworkUtils.setLoginUserHeader(builder, user)).build(); ServerWebExchange newExchange = exchange.mutate()
.request(builder -> SecurityFrameworkUtils.setLoginUserHeader(builder, user)).build();
return chain.filter(newExchange); return chain.filter(newExchange);
}); });
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论