2010-08-12 4 views
21

내 서비스에서 비동기 메서드를 사용하고 있습니다 (스프링 3 @Async 주석). 그리고 문제가 생겼습니다. 스폰 된 스레드에는 보안 컨텍스트가 없습니다. 왜냐하면 스프링 보안은 기본적으로 문맥 보유자에 대해 SecurityContextHolder.MODE_THREADLOCAL 전략을 사용합니다. 하지만 SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 전략을 사용해야합니다. 잠시 동안 내 AuthenticationSuccessHandler에 전략을 설정했습니다. 그러나 제 관점에서는 좋은 습관이 아닙니다.스프링 보안 SecurityContextHolder 전략을 설정하는 방법은 무엇입니까?

그렇다면 컨텍스트 구성 파일에서 어떻게 설정해야합니까?
스프링 보안의 버전은 3.0.0입니다.

+0

[Spring Security and @Async] (http://stackoverflow.com/questions/5246428/spring-security-and-async)의 가능한 복제본 – rince

답변

22

spring.security.strategyMODE_INHERITABLETHREADLOCAL으로 설정할 수 있습니다. 또한 웹 응용 프로그램을 시작할 때 SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)을 호출하고 컨텍스트 구성 파일에서 해당 값을 초기화하는 간단한 bean을 가질 수 있습니다.

SecurityContextHolder API

+23

간단한 bean에 대한 귀하의 조언에 감사드립니다. 하지만 더 편리한 해결책을 찾았습니다. 코드에 따라 보안 컨텍스트에 추가했습니다. viator

+0

이 콩으로 구성된 httpRequest.getRemoteUser()가 아직 없습니다. – javadev

14

당신을 도움이된다면 @viator의 답변에 대한 자바 설정.

@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의 일종 이상을 사용하면 이점이 있습니까? –

+0

예를 들어 보겠습니다. Postconstruct는 봄 콩을 만들지 않으므로 어떻게 될지 모르겠습니다. –

+0

나는 @PostConstruct 내부에서 SecurityContextHolder.setStrategyName()을 호출하는 것을 의미했습니다. 그것은 모두 정적이므로 내 생각에 아마 잘 작동 할 것입니다. 나는 총을 줘야 겠어. –

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> 

매력처럼 작동.

관련 문제