Выбор ответа Senior Spring Security обновлено

SecurityContext в другом потоке

Вопрос

В контроллере запускается CompletableFuture.supplyAsync(() -> service.load()), а service.load() читает SecurityContextHolder.getContext().getAuthentication(). Что вернётся?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Скорее всего null: контекст в ThreadLocal потока запроса. По умолчанию стратегия хранения ThreadLocal.

Варианты ответа

  1. Аутентификация текущего пользователя: Spring копирует её
  2. Аутентификация последнего пользователя этого потока пула
  3. Скорее всего null: контекст в ThreadLocal потока запросаправильный ответ
  4. Исключение AccessDeniedException при обращении

Разбор

По умолчанию стратегия хранения ThreadLocal. Поток общего пула ничего о запросе не знает. Для переноса используют DelegatingSecurityContextExecutor или DelegatingSecurityContextRunnable, а для @Async настраивают executor с такой обёрткой. «Чужая» аутентификация могла бы остаться, только если кто-то её не очистил, Spring сам контекст пула не заполняет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.