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.

24
demandé sur Andrew Tobilko 2010-08-12 17:04:11

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.

SecurityContextHolder API

25
répondu Gandalf 2016-08-20 08:18:44

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;
}
16
répondu Matt Broekhuis 2015-08-10 01:29:00

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.

4
répondu Taras Melon 2017-01-17 12:54:18