Встраивание: 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 в нужное место.