Это мой сценарий:
В моем приложении включен аудит Mongo с пользовательским AuditorAware, который получает текущего пользователя из файла SecurityContext
. Это хорошо работает с синхронными методами, и текущий аудитор успешно сохраняется, но я не могу заставить его работать должным образом с методами @Async
.
У меня есть асинхронный метод (CompletableFuture
), который вносит некоторые обновления в мою базу данных Mongo. Когда вызывается AuditorAware.getCurrentAuditor()
, информации об аутентификации не существует, и я не могу получить текущего аудитора (SecurityContextHolder.getContext().getAuthentication()
возвращает null
).
@Override
public User getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()
|| authentication instanceof AnonymousAuthenticationToken) {
log.error("Not authenticated");
return null;
}
[...]
}
Я использую DelegatingSecurityContextAsyncTaskExecutor
:
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(200);
executor.initialize();
return new DelegatingSecurityContextAsyncTaskExecutor(executor);
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new ItacaExceptionHandler();
}
}
Как я могу заставить его работать правильно?