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

This commit is contained in:
YunaiV 2022-07-26 23:49:43 +08:00
parent f1cf5f9f88
commit 1b84f3f1ea
1 changed files with 19 additions and 5 deletions

View File

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