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

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

Так как я могу настроить его в файле конфигурации контекста?
Версия весенней безопасности - 3.0.0.

4 ответа

Решение

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

API SecurityContextHolder

Конфигурация 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;
}

Немного другое решение, например, @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>

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

Через конфигурацию Java без отражения.

      import javax.annotation.PostConstruct;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.context.SecurityContextHolder;

@Configuration
public class SecurityConfig {

  @PostConstruct
  public void enableAuthCtxOnSpawnedThreads() {
    SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
  }
}
Другие вопросы по тегам