Как использовать основной Spring Context для асинхронного метода?

Имеется приложение на Spring Boot-стеке. В приложении есть асинхронный метод, который на фоне должен выполнять действия с авторизованным пользователем, но так как асинхронный метод использует другой контекст, то авторизованного пользователя он не видит. Каким образом можно передать свой основной context в асинхронный поток?

Асинхронность реализована через @EnableAsync и @Async.

SpringAsyncConfig:

@Configuration
@EnableAsync
public class SpringAsyncConfig {

    @Bean(name = "asyncExecutor")
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(3);
        executor.setMaxPoolSize(3);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("AsyncThread-");
        executor.initialize();
        return executor;
    }
}

Ответы (1 шт):

Автор решения: Gleb Kuznetsov

Если речь идет о доступе к SecurityContextHolder.getContext(), то можно использовать DelegatingSecurityContextAsyncTaskExecutor

@Bean 
public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTaskExecutor delegate) { 
    return new DelegatingSecurityContextAsyncTaskExecutor(delegate); 
}

Тогда контекст будет содержать данные аутентикации внутри методов с аннотацией @Async:

@Async
public void asyncCall() {
    log.info("Inside the @Async logic: "
      + SecurityContextHolder.getContext().getAuthentication().getPrincipal());
}

Более подробно тут

→ Ссылка