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

Как устроена SecurityFilterChain в Spring Security?

SeniorSpring SecuritySpring Boot >=3
Ещё спрашивают так:
  • Как настраивать 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

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

Подробно

Встраивание: 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() до конкретных правил.

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

  • Что такое SecurityContext?
  • Где обрабатываются 401 и 403?

Разбор темы

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

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

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

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

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