【发布时间】:2015-03-27 05:39:35
【问题描述】:
嘿
我发现一些代码允许通过覆盖代码ApplicationEventMulticaster 以async 的方式使用spring events,因此每个listener 都将在自己的线程中运行。 example code here
我的问题是:
安全上下文是否与publisher thread 相同?或者我必须将user logged id 传递给每个publisher
谢谢,
橡木
编辑:
浏览文档:
我找到了
某些应用程序并不完全适合使用 ThreadLocal,因为它们使用线程的特定方式。例如,Swing 客户端可能希望 Java 虚拟机中的所有线程使用相同的安全上下文。 SecurityContextHolder 可以在启动时配置策略,以指定您希望如何存储上下文。对于独立应用程序,您将使用 SecurityContextHolder.MODE_GLOBAL 策略。其他应用程序可能希望安全线程产生的线程也采用相同的安全身份。这是通过使用 SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 来实现的。您可以通过两种方式从默认的 SecurityContextHolder.MODE_THREADLOCAL 更改模式。第一个是设置系统属性,第二个是调用SecurityContextHolder的静态方法。大多数应用程序不需要更改默认设置,但如果您这样做,请查看 JavaDocs for SecurityContextHolder 以了解更多信息。
所以看来,如果一个设置
SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 应该可以工作
我的问题是:有人有这种配置的经验吗?
【问题讨论】:
-
将为新的异步线程创建新的
securityContext如果您需要保持相同的SecurityContext,您有责任在新线程中将当前SecurityContext传递给SecurityContextHolder,并将其分配给ThreadLoacal在这种情况下 -
你也应该在线程完成后清除
SecurityContextHolder -
@user1289300,谢谢你的回答你试过了吗?我已经更新了我的问题。
标签: spring asynchronous spring-security event-handling