Как настроить Spring стратегию безопасности SecurityContextHolder?
Я использую асинхронные методы в моей службе (аннотация Spring 3 @Async
). И у меня проблема: порожденный поток не имеет контекста безопасности. Причиной этого является Spring Безопасность по умолчанию использует стратегию SecurityContextHolder.MODE_THREADLOCAL
для своего владельца контекста. Но мне нужно использовать стратегию SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
.
На данный момент я настраиваю стратегию в своем AuthenticationSuccessHandler. Но, на мой взгляд, это не очень хорошая практика.
Итак, как я могу настроить его в файле конфигурации контекста?
Версия Spring security - 3.0.0.
Ответы
Ответ 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>
Работает как шарм.
Ответ 4
Пожалуйста, проверьте это: приведен соответствующий пример. https://www.baeldung.com/spring-security-async-principal-propagation https://github.com/eugenp/tutorials/blob/master/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java