Вопрос с собеседования · Spring

Как устроена 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

Подробно

Встраивание: 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?

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования