spring-security - Spring 的 Security ReactiveAuthenticationManager 不处理 Redis 异步调用以检查令牌撤销
问题描述
我有以下 ReactiveAuthenticationManager 的简单实现(我通过在线 Reactive Spring Security 教程找到了它):
@Override
@SuppressWarnings("unchecked")
public Mono<Authentication> authenticate(Authentication authentication) {
String authToken = authentication.getCredentials().toString();
try {
if (!jwtUtil.validateToken(authToken, true)) {
return empty();
}
Claims claims = jwtUtil.getAllClaimsFromToken(authToken, true);
return just(new UsernamePasswordAuthenticationToken(claims.getSubject(), null));
} catch (Exception e) {
return empty();
}
}
这可以正常工作,但是如果我使用以下版本通过异步 Redis 调用检查令牌是否被撤销,Spring 不会以正确的顺序执行调用并直接跳转到 RestController。
@Override
@SuppressWarnings("unchecked")
public Mono<Authentication> authenticate(Authentication authentication) {
String authToken = authentication.getCredentials().toString();
try {
if (!jwtUtil.validateToken(authToken, true)) {
return empty();
}
Claims claims = jwtUtil.getAllClaimsFromToken(authToken, true);
return reactiveTemplate.opsForZSet().score("nameOfTheSortedSet", authToken)
.flatMap(score -> score > 0 ? empty() : just(new UsernamePasswordAuthenticationToken(claims.getSubject(), null, authorities)))
} catch (Exception e) {
return empty();
}
}
我的理论是调用实际上执行了,但是为时已晚,在来自控制器或服务的业务逻辑执行之后。
解决方案
推荐阅读
- html - 如何对 HTML 文件中的图片进行排序
- redux - 使用动作创建者在另一个动作创建者中调度动作
- php - 我如何在 laravel 中使用 Paypal ipn
- hibernate - 问题:节点没有数据类型:org.hibernate.hql.internal.ast.tree.MethodNode
- c# - 从另一个脚本修改变量
- javascript - 异步/等待 - 节点 - Express - Mongo
- c# - RabbitMq 消息导致服务器崩溃,导致无限重试
- python-3.x - 如何在绑定到 Telethon 的异步函数中执行 for in 循环?
- python - 带有 Docker 的 Python 客户端服务器 - 连接被拒绝
- c# - 如何通过属性值的模式查找 XML 元素