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 - 未触发
假设安全配置正确。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]]
| 归档时间: |
|
| 查看次数: |
7938 次 |
| 最近记录: |