如何设置Spring Security SecurityContextHolder策略?

时间:2010-08-12 13:04:12

标签: spring spring-security

我在我的服务中使用异步方法(Spring 3 @Async注释)。而且我遇到了问题 - 衍生线程没有安全上下文。原因是Spring Security默认使用SecurityContextHolder.MODE_THREADLOCAL策略作为其上下文持有者。但我需要使用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL策略。 目前我在 AuthenticationSuccessHandler 中设置了策略。但在我看来,这不是一个好习惯。

那么如何在上下文配置文件中进行设置呢? spring security的版本是3.0.0。

4 个答案:

答案 0 :(得分:28)

您可以将环境变量spring.security.strategy设置为MODE_INHERITABLETHREADLOCAL。您还可以在Web应用程序启动时调用SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)并在上下文配置文件中初始化该值。

SecurityContextHolder API

答案 1 :(得分:25)

@viator的java配置,如果它可以帮助你的答案。

@Bean
public MethodInvokingFactoryBean methodInvokingFactoryBean() {
    MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
    methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class);
    methodInvokingFactoryBean.setTargetMethod("setStrategyName");
    methodInvokingFactoryBean.setArguments(new String[]{SecurityContextHolder.MODE_INHERITABLETHREADLOCAL});
    return methodInvokingFactoryBean;
}

答案 2 :(得分:5)

另一个解决方案,比如@viator写道:

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

像魅力一样工作。

答案 3 :(得分:0)

通过Java配置而无需反思。

import javax.annotation.PostConstruct;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.context.SecurityContextHolder;

@Configuration
public class SecurityConfig {

  @PostConstruct
  public void enableAuthCtxOnSpawnedThreads() {
    SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
  }
}