Spring Security异步方法调用认证传递问题
问题描述
Spring支持异步方法调用,若在异步方法中,需要获取之前已经通过的认证信息,不做特殊处理的情况下是无法获取Authentication对象的,比如我下面的代码,因为authentication为null,直接抛出了空指针异常:
@Service
public class HelloService {
@Async
public Future<String> testMethodSecurity() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String message = String.format(
"当前认证用户为{%s}, 拥有的权限是{%s}",
authentication.getName(),
authentication.getAuthorities().toString());
return new AsyncResult<String>(message);
}
}
解决方案
Spring容器启动的时候,调用SecurityContextHolder类的静态方法setStrategyName,将策略设置为MODE_INHERITABLETHREADLOCAL,这样就可以将认证信息传递到异步方法中
第一种方法
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
import org.springframework.context.annotation.Bea