如何设置Spring Security SecurityContextHolder策略?

via*_*tor 30 spring spring-security

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

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

Gan*_*alf 34

您可以将环境变量设置spring.security.strategyMODE_INHERITABLETHREADLOCAL.您还可以在Web应用程序启动调用期间使用一个简单的bean,SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)并在上下文配置文件中初始化该值.

SecurityContextHolder API

  • 感谢您关于简单豆的提示.但是我找到了更方便的解决方案 - 我在代码中添加了我的安全上下文:<beans:bean class ="org.springframework.beans.factory.config.MethodInvokingFactoryBean"p:targetClass ="org.springframework.security.core. context.SecurityContextHolder"p:targetMethod ="setStrategyName"p:arguments ="MODE_INHERITABLETHREADLOCAL"/> (23认同)
  • 请注意其中的含义:如果使用线程池,您还应该使用 setTaskDecorator() ,如此处所述 https://github.com/spring-projects/spring-security/issues/6856#issuecomment-518787966 我认为这非常重要。 (3认同)
  • @FrancoisMarot 感谢您的线程池提示!它救了我的屁股。使用“SecurityContextHolder.MODE_INHERITABLETHREADLOCAL”,我的线程池有时无法获取用户上下文。使用“executor.setTaskDecorator(runnable -&gt; new DelegatingSecurityContextRunnable(runnable));”,似乎总是如此。 (2认同)

Mat*_*uis 26

@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;
}
Run Code Online (Sandbox Code Playgroud)


小智 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>
Run Code Online (Sandbox Code Playgroud)

像魅力一样工作。


mar*_*ggs 5

通过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);
  }
}
Run Code Online (Sandbox Code Playgroud)