【发布时间】:2018-01-03 11:24:43
【问题描述】:
当我尝试从并行流中的安全上下文中获取主体时,当它不在主线程中时,它总是返回 null。
当用户通过身份验证时,以下代码会失败:
listOfSomething.parallelStream()
.foreach(el -> {
if (SecurityContextHolder.getContext().getAuthentication().getPrincipal() == null){
throw new RuntimeException();
}});
文档说:
定义与相关联的最低安全信息的接口 当前执行线程。
但是,有什么办法吗?它从主线程开始并使用 ForkJoinPool
谢谢!
【问题讨论】:
-
这不是重复的。在链接的问题中,OP 显式生成了一个线程,并尝试从该线程访问
SecurityContext。在这种情况下,我们正在处理一个子线程,MODE_INHERITABLETHREADLOCAL成功地传播了SecurityContext。在这里,我们使用parallelStream(),它将使用来自 fork/join 池(依赖于实现)的线程,这些线程可能不是启动线程的子线程。 -
This answer 可能是一个更有帮助的指针。对于并行流操作期间
SecurityContext传播的情况,我自己还没有验证。
标签: java spring spring-boot spring-security stream