首页 > 解决方案 > 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();
    }
}

我的理论是调用实际上执行了,但是为时已晚,在来自控制器或服务的业务逻辑执行之后。

标签: spring-securityreactive-programmingspring-webflux

解决方案


推荐阅读