Spring异步事件和Spring安全上下文

时间:2015-01-28 10:47:02

标签: spring asynchronous spring-security event-handling

我找到了一些代码,允许通过覆盖代码spring eventsasync方式使用ApplicationEventMulticaster,因此每个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应该有效

我的问题是:有没有人有这种配置的经验?

1 个答案:

答案 0 :(得分:0)

解决方案:

https://stackoverflow.com/a/3468965/1211174

组合doc @viator 备注中的question

设置规则以从线程继承安全上下文

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"        p:targetClass="org.springframework.security.core.context.SecurityContextHolder"
    p:targetMethod="setStrategyName" p:arguments="MODE_INHERITABLETHREADLOCAL" />

确保弹出事件将被初始化

<bean id="applicationEventMulticaster"
    class="org.springframework.context.event.SimpleApplicationEventMulticaster">
    <property name="taskExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor">
        </bean>
    </property>
</bean>