SpringBoot 2.X 异步处理@Async 拿不到 SpringSecurity 认证信息问题 解决方案

问题描述

main方法开启异步处理

service使用异步注解

SpringBoot 2.X 异步处理@Async 拿不到 SpringSecurity 认证信息问题 解决方案_第1张图片

springSecurity 获取认证信息返回null

SpringBoot 2.X 异步处理@Async 拿不到 SpringSecurity 认证信息问题 解决方案_第2张图片

问题原因

SpringBoot 2.X 异步处理@Async 拿不到 SpringSecurity 认证信息问题 解决方案_第3张图片

SpringSecurity 是线程绑定的  异步处理是重新new一个线程进行业务处理

所以说 新线程里是没有 认证信息的

解决方案

SpringBoot 2.X 异步处理@Async 拿不到 SpringSecurity 认证信息问题 解决方案_第4张图片

需要重写AsyncConfigurer 使用SpringSecurity 的 装饰线程池 这样就可以携带认证信息了

@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {

    /**
     * 异步执行需要使用权限框架自带的包装线程池  保证权限信息的传递
     */
    @Override
    public Executor getAsyncExecutor() {
        return new DelegatingSecurityContextExecutorService(Executors.newFixedThreadPool(5));
    }

}

 

你可能感兴趣的:(springboot经验总结)