【问题标题】:Spring async events and Spring security contextSpring 异步事件和 Spring 安全上下文
【发布时间】:2015-03-27 05:39:35
【问题描述】:

我发现一些代码允许通过覆盖代码ApplicationEventMulticasterasync 的方式使用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


【解决方案1】:

解决方案:

结合question中的dochttps://stackoverflow.com/a/3468965/1211174处的@viator备注

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

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

确保 spring 事件是异步的

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

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多