Получить доступ

Как в Spring Security устроены аутентификация и авторизация — какие объекты за них отвечают?

MiddleHTTP, cookies и сессииSpring SecuritySpring Boot >=3
Ещё спрашивают так:
  • Что такое AuthenticationManager и SecurityContext?
Коротко

Аутентификация: фильтр извлекает учётные данные → AuthenticationManager (через AuthenticationProvider, UserDetailsService, PasswordEncoder) проверяет → готовый Authentication кладётся в SecurityContext. Авторизация: AuthorizationManager сверяет права (GrantedAuthority) с правилами для URL или метода.

  • SecurityContext живёт в потоке, а между запросами — в сессии или нигде (JWT)
  • 401 — не аутентифицирован, 403 — нет прав
  • Правила: authorizeHttpRequests для URL, @PreAuthorize для методов

А ещё Spring Security 6: WebSecurityConfigurerAdapter удалён, конфигурация — бином SecurityFilterChain

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Аутентификация — «кто ты»:

  1. фильтр в цепочке (UsernamePasswordAuthenticationFilter, BearerTokenAuthenticationFilter для JWT, BasicAuthenticationFilter) извлекает учётные данные и создаёт неаутентифицированный Authentication;
  2. AuthenticationManager (обычно ProviderManager) перебирает AuthenticationProvider: для логина и пароля — DaoAuthenticationProvider, который берёт пользователя из UserDetailsService и сверяет пароль через PasswordEncoder (BCrypt, Argon2);
  3. успех — аутентифицированный Authentication с principal и списком GrantedAuthority кладётся в SecurityContext. Неудача — AuthenticationException и ответ 401.

Хранение: SecurityContextHolder держит контекст в ThreadLocal на время запроса. Между запросами — в HTTP-сессии (формы) или нигде: при JWT токен проверяется заново в каждом запросе.

Авторизация — «что можно»:

  • для URL — http.authorizeHttpRequests(a -> a.requestMatchers("/admin/**").hasRole("ADMIN")), правила проверяются по порядку, первое совпадение решает;
  • для методов — @EnableMethodSecurity и @PreAuthorize("hasRole('ADMIN')");
  • решение принимает AuthorizationManager; отказ — AccessDeniedException и ответ 403.

Роли и права: hasRole("ADMIN") проверяет authority ROLE_ADMIN (префикс добавляется автоматически), hasAuthority("orders:write") — точное значение.

Что хотят услышать

  • Путь аутентификации: фильтр, AuthenticationManager, провайдер, SecurityContext.
  • Хранение контекста: поток, сессия, stateless.
  • Авторизация для URL и методов, роли и authorities.
  • Коды 401 и 403.

Частые ошибки

  • Путать hasRole и hasAuthority (префикс ROLE_).
  • Проверять права вручную в контроллерах вместо правил.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Фильтр извлекает учётные данные, AuthenticationManager проверяет их через AuthenticationProvider, результат кладётся в SecurityContext; авторизация сверяет GrantedAuthority с правилами через AuthorizationManager
  • ✗Аутентификацией и авторизацией занимается один @PreAuthorize на контроллере
  • ✗Spring Security хранит пароль пользователя в SecurityContext и сравнивает его в каждом контроллере
  • ✗Авторизация выполняется до аутентификации

Что спросят дальше

  • Чем session auth отличается от JWT?
  • Что такое RBAC и ABAC?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем