2010-08-12 949 views
21

我在我的服務中使用異步方法(Spring 3 @Async註釋)。而我有一個問題 - 產生的線程沒有安全上下文。它的原因是Spring Security默認使用SecurityContextHolder.MODE_THREADLOCAL策略作爲其上下文持有者。但我需要使用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL策略。 目前我在我的AuthenticationSuccessHandler中設置策略。但以我的觀點來看,這不是一個好習慣。如何設置Spring Security SecurityContextHolder策略?

那麼我怎樣才能在上下文配置文件中設置它?
spring安全的版本是3.0.0。

+0

[Spring Security and @Async]的可能重複(http://stackoverflow.com/questions/5246428/spring-security-and-async) – rince 2016-01-06 15:50:55

回答

22

您可以將環境變量spring.security.strategy設置爲MODE_INHERITABLETHREADLOCAL。您也可以擁有一個簡單的bean,在您的Web應用程序啓動期間調用SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)並在您的上下文配置文件中初始化該值。

SecurityContextHolder API

+23

感謝您關於簡單bean的提示。但我發現更方便的解決方案 - 我添加到我的安全上下文中的代碼: viator 2010-08-13 08:46:15

+0

我仍然沒有配置此bean的httpRequest.getRemoteUser()。 – javadev 2018-02-26 17:58:42

14

爲@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; 
} 
+0

最新評論:-)爲了安全起見,在配置類的某處使用某種@PostConstruct是否有優勢? – 2017-01-16 20:15:47

+0

我不得不看一個例子。 Postconstruct不會做春豆,所以我不知道如何? – 2017-01-16 20:17:14

+0

我的意思是像@PostConstruct調用SecurityContextHolder.setStrategyName();這一切都是靜態的,所以我的猜測可能會起作用。我必須一試。 – 2017-01-16 22:43:22

4

一點點的另一種解決方案,像@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> 

工作就像一個魅力。

相關問題