REST-метод с аутентификацией через Spring Security. Нужно запустить обработку в отдельном потоке, вернуть OK, но сохранить SecurityContext для использования в потоке

Используйте DelegatingSecurityContextExecutor или DelegatingSecurityContextRunnable: они переносят текущий SecurityContext в задачу и очищают его после выполнения. Обычный ThreadLocal сам в пул не переносится.

Короткий ответ

Что ответить на собеседовании

Используйте 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее