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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/192714.html