如何从WebFlux中的ReactiveSecurityContextHolder获取当前用户?

Tar*_*iqN 9 java spring spring-boot spring-webflux

通常在使用 Spring Boot 时,获取当前登录用户的常见方法是使用:

SecurityContextHolder.getContext();
Run Code Online (Sandbox Code Playgroud)

这在使用反应式编程和 Java 中的 Mono 时不起作用,因为它们不属于同一线程。推荐使用:

ReactiveSecurityContextHolder.getContext()
Run Code Online (Sandbox Code Playgroud)

我读过很多文章、StackOverflow 问题和答案,但从未找到如何完全集成 ReactiveSecurityContextHolder 的完整解释或示例。

任何帮助将不胜感激。

这是我尝试过的:

   @RequestMapping(value = "/get-auth", method = RequestMethod.GET)
public @ResponseBody Mono<Authentication> test(Authentication authp) {
    return ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication).doOnNext(auth -> {
        log.info("print auth", String.valueOf(auth));
    }).doOnSuccess(auth -> {
        log.error("print auth", auth);
    });
}
Run Code Online (Sandbox Code Playgroud)

doOnSuccess - 返回 null
doOnNext - 未触发

lka*_*ris 4

假设安全配置正确。Spring securityReactiveSecurityContextHolder在订阅期间初始化,以便您可以使用以下命令在此链中访问它ReactiveSecurityContextHolder.getContext()

@GetMapping
Mono<Void> getItems() {
    return ReactiveSecurityContextHolder.getContext()
            .map(SecurityContext::getAuthentication)
            .doOnNext(auth -> log.info(String.valueOf(auth)))
            .then();
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [用户名=admin,密码=[受保护],启用=true,AccountNonExpired=true,credentialsNonExpired=true,AccountNonLocked=true,授予权限=[ROLE_ADMIN]],凭据=[受保护]、已验证=true、详细信息=null、授予权限=[ROLE_ADMIN]]