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 @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 {
} }
// 情况二如果有 Token 令牌则解析对应 userIduserTypetenantId 等字段并通过 通过 Header 转发给服务 // 情况二如果有 Token 令牌则解析对应 userIduserTypetenantId 等字段并通过 通过 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);
}); });
} }