Comment mettre en place Spring Security SecurityContextHolder stratégie?
J'utilise des méthodes asynchrones dans mon service (annotation Spring 3 @Async
). Et j'ai un problème-le thread engendré n'a pas de contexte de sécurité. La cause en est Spring Security utilise par défaut SecurityContextHolder.MODE_THREADLOCAL
stratégie pour son détenteur de contexte. Mais je dois utiliser SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
Stratégie.
Pour le moment, j'ai mis en place une stratégie dans mon AuthenticationSuccessHandler . Mais de mon point de vue, ce n'est pas une bonne pratique.
Alors, comment puis-je le configurer dans le fichier de configuration de contexte?
La Version de printemps la sécurité est 3.0.0.
3 réponses
, Vous pouvez définir la variable d'environnement spring.security.strategy
à MODE_INHERITABLETHREADLOCAL
. Vous pouvez également avoir un bean simple qui pendant le démarrage de vos applications web appelle SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)
et initialise cette valeur dans votre fichier de configuration de contexte.
La configuration java pour la réponse de @viator si elle vous aide.
@Bean
public MethodInvokingFactoryBean methodInvokingFactoryBean() {
MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class);
methodInvokingFactoryBean.setTargetMethod("setStrategyName");
methodInvokingFactoryBean.setArguments(new String[]{SecurityContextHolder.MODE_INHERITABLETHREADLOCAL});
return methodInvokingFactoryBean;
}
Un peu une autre solution, comme @viator écrire:
<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>
Travailler comme un charme.