Если вы хотите получить доступ к контексту безопасности в асинхронных вызовах, вы можете реализовать исполняющий контекст пул потоков с учетом контекста безопасности при создании потоков, как показано ниже.
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, переопределите другие методы в ThreadPoolTaskExecutor, который также поддерживает выполнение Runnable.