Как в Spring Security устроены аутентификация и авторизация — какие объекты за них отвечают?
- Что такое AuthenticationManager и SecurityContext?
Аутентификация: фильтр извлекает учётные данные → AuthenticationManager (через AuthenticationProvider, UserDetailsService, PasswordEncoder) проверяет → готовый Authentication кладётся в SecurityContext. Авторизация: AuthorizationManager сверяет права (GrantedAuthority) с правилами для URL или метода.
- SecurityContext живёт в потоке, а между запросами — в сессии или нигде (JWT)
- 401 — не аутентифицирован, 403 — нет прав
- Правила:
authorizeHttpRequestsдля URL,@PreAuthorizeдля методов
А ещё Spring Security 6: WebSecurityConfigurerAdapter удалён, конфигурация — бином SecurityFilterChain
Подробно
Аутентификация — «кто ты»:
- фильтр в цепочке (
UsernamePasswordAuthenticationFilter,BearerTokenAuthenticationFilterдля JWT,BasicAuthenticationFilter) извлекает учётные данные и создаёт неаутентифицированныйAuthentication; AuthenticationManager(обычноProviderManager) перебираетAuthenticationProvider: для логина и пароля —DaoAuthenticationProvider, который берёт пользователя изUserDetailsServiceи сверяет пароль черезPasswordEncoder(BCrypt, Argon2);- успех — аутентифицированный
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_).
- Проверять права вручную в контроллерах вместо правил.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Аутентификацией и авторизацией занимается один @PreAuthorize на каждом методе контроллера
- ✗Spring Security хранит пароль в SecurityContext и заново сравнивает его в каждом методе контроллера
- ✓AuthenticationManager кладёт результат в SecurityContext, AuthorizationManager проверяет права
- ✗Авторизация выполняется до аутентификации
Что спросят дальше
- Чем session auth отличается от JWT?
- Что такое RBAC и ABAC?
Разбор темы
- HTTP, cookies и сессии
Семантика HTTP-методов и кэширование, cookies и их флаги безопасности, stateful против stateless сессий, HTTPS и граница authn/authz.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.