SpringBoot2 异步处理@Async 拿不到 SpringSecurity 认证信息问题

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。SpringBoot2 异步处理@Async 拿不到 SpringSecurity 认证信息问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!