Подтвердить что ты не робот

Как настроить Spring стратегию безопасности SecurityContextHolder?

Я использую асинхронные методы в моей службе (аннотация Spring 3 @Async). И у меня проблема: порожденный поток не имеет контекста безопасности. Причиной этого является Spring Безопасность по умолчанию использует стратегию SecurityContextHolder.MODE_THREADLOCAL для своего владельца контекста. Но мне нужно использовать стратегию SecurityContextHolder.MODE_INHERITABLETHREADLOCAL. На данный момент я настраиваю стратегию в своем AuthenticationSuccessHandler. Но, на мой взгляд, это не очень хорошая практика.

Итак, как я могу настроить его в файле конфигурации контекста?
Версия Spring security - 3.0.0.

4b9b3361

Ответ 1

Вы можете установить переменную окружения spring.security.strategy на MODE_INHERITABLETHREADLOCAL. У вас также может быть простой bean, который во время запуска веб-приложений вызывает SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL) и инициализирует это значение в файле конфигурации контекста.

API SecurityContextHolder

Ответ 2

Конфигурация java для ответа @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;
}

Ответ 3

Немного другое решение, например @viator write:

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

Работает как шарм.