Выбор ответа Senior Spring Security обновлено
SecurityContext в другом потоке
Вопрос
В контроллере запускается CompletableFuture.supplyAsync(() -> service.load()), а service.load() читает SecurityContextHolder.getContext().getAuthentication(). Что вернётся?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Скорее всего null: контекст в ThreadLocal потока запроса. По умолчанию стратегия хранения ThreadLocal.
Варианты ответа
- Аутентификация текущего пользователя: Spring копирует её
- Аутентификация последнего пользователя этого потока пула
- Скорее всего null: контекст в ThreadLocal потока запросаправильный ответ
- Исключение AccessDeniedException при обращении
Разбор
По умолчанию стратегия хранения ThreadLocal. Поток общего пула ничего о запросе не знает. Для переноса используют DelegatingSecurityContextExecutor или DelegatingSecurityContextRunnable, а для @Async настраивают executor с такой обёрткой. «Чужая» аутентификация могла бы остаться, только если кто-то её не очистил, Spring сам контекст пула не заполняет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.