Используйте DelegatingSecurityContextExecutor или DelegatingSecurityContextRunnable: они переносят текущий SecurityContext в задачу и очищают его после выполнения. Обычный ThreadLocal сам в пул не переносится.
REST-метод с аутентификацией через Spring Security. Нужно запустить обработку в отдельном потоке, вернуть OK, но сохранить SecurityContext для использования в потоке
Используйте DelegatingSecurityContextExecutor или DelegatingSecurityContextRunnable: они переносят текущий SecurityContext в задачу и очищают его после выполнения. Обычный ThreadLocal сам в пул не переносится.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Используйте DelegatingSecurityContextExecutor или DelegatingSecurityContextRunnable: они переносят текущий SecurityContext в задачу и очищают его после выполнения. Обычный ThreadLocal сам в пул не переносится.
Пример внутри обработчика уже аутентифицированного запроса:
Executor secured = new DelegatingSecurityContextExecutor(workerExecutor);
secured.execute(() -> service.process());
return ResponseEntity.ok().build();
workerExecutor здесь — управляемый ограниченный executor; переполнение очереди нужно обработать до ответа. Контекст не следует затем мутировать. OK означает только принятие задачи, а не её успех; для асинхронного API часто понятнее 202 и operation ID. Для переживания рестарта нужна долговечная очередь, а не только поток.
Источник: docs.spring.io.