2010-08-12 2 views
21

Utilizzo metodi asincroni nel mio servizio (annotazione Spring 3 @Async). E ho un problema: il thread generato non ha un contesto di sicurezza. Causa di ciò è Spring Security per impostazione predefinita utilizza la strategia SecurityContextHolder.MODE_THREADLOCAL per il relativo titolare del contesto. Ma ho bisogno di usare la strategia SecurityContextHolder.MODE_INHERITABLETHREADLOCAL. Per il momento ho impostato la strategia nel mio AuthenticationSuccessHandler. Ma dal mio punto di vista non è una buona pratica.Come impostare la strategia SecurityContextHolder di Spring Security?

Quindi, come posso configurarlo nel file di configurazione del contesto?
La versione di Spring Security è 3.0.0.

+0

Possibile duplicato di [Spring Security e @Async] (http://stackoverflow.com/questions/5246428/spring-security-and-async) – rince

risposta

22

È possibile impostare la variabile di ambiente spring.security.strategy su MODE_INHERITABLETHREADLOCAL. Si potrebbe anche avere un bean semplice che durante le chiamate di avvio delle applicazioni Web SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL) e inizializzare tale valore nel file di configurazione del contesto.

SecurityContextHolder API

+23

Grazie per il vostro suggerimento sul bean semplice. Ma ho trovato la soluzione più conveniente per me - ho aggiunto al mio contesto di sicurezza il seguente codice: viator

+0

Non ho ancora httpRequest.getRemoteUser() con questo bean configurato. – javadev

14

Il config java per la risposta s' @viator se ti aiuta.

@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

Commento in ritardo :-) Esiste un vantaggio nell'usare questo sopra una sorta di @PostConstruct da qualche parte in una classe di configurazione per la sicurezza? –

+0

Dovrei vedere un esempio. La postcostruzione non farà un fagiolo primaverile quindi non sono sicuro di come? –

+0

Intendevo come all'interno di @PostConstruct chiamando SecurityContextHolder.setStrategyName(); È tutto statico quindi la mia ipotesi è che probabilmente funzionerà pure. Dovrò dargli un colpo. –

4

Un po 'un'altra soluzione, come @viator scrittura:

<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> 

Lavorare come un fascino.