1.问题描述
main方法开启异步处理
使用异步注解
springSecurity 获取认证信息返回null,无法获取相关信息。
问题原因,SpringSecurity 是线程绑定的 异步处理是重新new一个线程进行业务处理
所以说 新线程里是没有 认证信息的
2.解决方案
在SecurityConfig配置类中加入以下配置,重写AsyncConfigurer 使用SpringSecurity 的 装饰线程池 这样就可以携带认证信息
/**
* SpringBoot2 异步处理@Async 拿不到 SpringSecurity 认证信息问题
*/
// @Bean
// public MethodInvokingFactoryBean methodInvokingFactoryBean() {
// MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
// methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class);
// methodInvokingFactoryBean.setTargetMethod("setStrategyName");
// methodInvokingFactoryBean.setArguments((Object) new String[]{SecurityContextHolder.MODE_INHERITABLETHREADLOCAL});
// return methodInvokingFactoryBean;
// }
/**
* SpringBoot2 异步处理@Async 拿不到 SpringSecurity 认证信息问题
* @return
*/
@Bean
public InitializingBean initializingBean(){
return () -> SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}