如果您想要訪問異步調用中的安全上下文,您可以實現上下文感知線程池執行器來存儲安全上下文時創建像下面的線程。
public class CustomExecutor extends ThreadPoolTaskExecutor { @Override public <T> Future<T> submit(Callable<T> task) { return super.submit(new ScopeAwareCallable<T>(task, SecurityContextHolder.getContext())); } }
public class ScopeAwareCallable<T> implements Callable<T> {
private Callable<T> callableTask;
private SecurityContext securityContext;
public ScopeAwareCallable(Callable<T> task, SecurityContext secContex) {
this.callableTask = task;
this.securityContext = secContex;
}
@Override
public T call() throws Exception {
if(securityContext != null){
SecurityContextHolder.setContext(securityContext);
}
try {
return callableTask.call();
}
finally {
SecurityContextHolder.clearContext();
}
}
}
配置這是在Spring配置你的任務執行。如果您使用Runnable而不是Callable,則可以重寫支持Runnable執行的ThreadPoolTaskExecutor中的其他方法。
請參閱http://stackoverflow.com/questions/3467918/how-to-set-up-spring-security-securitycontextholder-strategy – Ritesh