Как устроена SecurityFilterChain в Spring Security?
- Как настраивать Spring Security 6?
- Что такое DelegatingFilterProxy?
Spring Security — цепочка сервлетных фильтров. В контейнер встраивается DelegatingFilterProxy → FilterChainProxy, который выбирает подходящую **SecurityFilterChain** по запросу и прогоняет его через её фильтры (CORS, CSRF, аутентификация, ExceptionTranslation, Authorization).
- Конфигурация — бином SecurityFilterChain и HttpSecurity с лямбдами (WebSecurityConfigurerAdapter удалён в Spring Security 6)
- Несколько цепочек — разные правила для /api/** и веб-страниц, порядок через @Order
- Порядок правил внутри authorizeHttpRequests важен: первое совпадение решает
А ещё Отладка: logging.level.org.springframework.security=TRACE
Подробно
Встраивание: Spring Boot регистрирует фильтр DelegatingFilterProxy (сервлетный фильтр, который делегирует бину) → FilterChainProxy. Тот хранит список SecurityFilterChain, у каждой — правило выбора запросов (securityMatcher) и свой набор фильтров. Срабатывает первая подходящая цепочка.
Фильтры в цепочке (упрощённо, по порядку): CorsFilter, CsrfFilter, LogoutFilter, фильтры аутентификации (UsernamePasswordAuthenticationFilter, BearerTokenAuthenticationFilter, BasicAuthenticationFilter), SecurityContextHolderFilter, ExceptionTranslationFilter (превращает исключения безопасности в 401/403), AuthorizationFilter.
Конфигурация Spring Security 6:
@Bean
SecurityFilterChain api(HttpSecurity http) throws Exception {
return http
.securityMatcher("/api/**")
.authorizeHttpRequests(a -> a
.requestMatchers(HttpMethod.GET, "/api/public/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated())
.oauth2ResourceServer(o -> o.jwt(Customizer.withDefaults()))
.sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.csrf(c -> c.disable())
.build();
}
Ловушки: правила проверяются по порядку — anyRequest() должен быть последним; WebSecurityConfigurerAdapter и antMatchers из старых статей в Spring Security 6 удалены; свой фильтр добавлять через addFilterBefore/After в нужное место.
Что хотят услышать
- Цепочка фильтров и FilterChainProxy.
- Несколько SecurityFilterChain.
- Конфигурация в стиле Spring Security 6.
- Порядок правил.
Частые ошибки
- Копировать конфигурацию с WebSecurityConfigurerAdapter.
- Ставить anyRequest() до конкретных правил.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Цепочка сервлетных фильтров, которую FilterChainProxy выбирает по запросу
- ✗Интерцептор Spring MVC, который проверяет права после вызова контроллера
- ✗Наследник WebSecurityConfigurerAdapter, единственный на приложение, без возможности разделить правила для API и страниц
- ✗Аспект на методах сервисов
Что спросят дальше
- Что такое SecurityContext?
- Где обрабатываются 401 и 403?
Разбор темы
- Spring Security: фильтр-цепочка и авторизация
SecurityFilterChain, аутентификация (UserDetailsService/PasswordEncoder), SecurityContext, авторизация запросов и CSRF/CORS/сессии.
Связанные вопросы
- Как в Spring Security устроены аутентификация и авторизация — какие объекты за них отвечают? Middle
- В конфигурации указано сначала anyRequest().authenticated(), а затем requestMatchers("/public/**").permitAll(). Что получится? Middle
- Как Spring Security встраивается в обработку запроса? Junior
- Чем Servlet Filter отличается от HandlerInterceptor? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.