перенести фильтр для определенных antMatchers в Spring-Security 6
В настоящее время я занимаюсь переносом наших сервисов на Spring Boot 3 с Spring Security 6.
При этом я в настоящее время зависаю над проблемой: я хочу установить фильтр только для одного набора конечных точек:
@Bean
@Order(10)
SecurityFilterChain internalEndpointsFilterChain(HttpSecurity http) {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(STATELESS)
.and()
.antMatcher("/cache/**") <<<-- Problem
.addFilterBefore(sharedSecretAuthenticationFilter(), ExceptionTranslationFilter)
.exceptionHandling({ exceptionHandling ->
exceptionHandling.authenticationEntryPoint(new UnauthorizedAuthenticationEntryPoint())
})
.authorizeRequests({ authorizeRequests ->
authorizeRequests.anyRequest().fullyAuthenticated()
})
.build()
}
Когда я переношу все, что меняю здесь, я всегда получаю ошибку 401 для этих конечных точек.
Моя попытка:
http.csrf { it.disable() }
.sessionManagement { it.sessionCreationPolicy(STATELESS) }
.securityMatcher("/cache/**")
.addFilterBefore(sharedSecretAuthenticationFilter(), ExceptionTranslationFilter)
.exceptionHandling({ exceptionHandling ->
exceptionHandling.authenticationEntryPoint(new UnauthorizedAuthenticationEntryPoint())
})
.authorizeHttpRequests({ authorizeRequests ->
authorizeRequests
.anyRequest().fullyAuthenticated()
})
.build()
Редактировать после комментария: важно, чтобы нам нужно было связать эту цепочку безопасности с приведенным выше регулярным выражением, поскольку у нас есть другая цепочка для остальных конечных точек, которая настроена в библиотеке и включена в наш сервис:
@Bean
@Order(10)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(STATELESS)
.and()
.addFilterAfter(oauthAuthenticationFilter(jwtProcessor), LogoutFilter)
.addFilterAfter(authenticationLessModeAuthenticationFilter(), OAuthAuthenticationFilter)
.exceptionHandling({ exceptionHandling ->
exceptionHandling.authenticationEntryPoint(new UnauthorizedAuthenticationEntryPoint())
})
.authorizeHttpRequests({ authorizeRequests ->
authorizeRequests
.requestMatchers(antMatcher("/error")).permitAll()
.anyRequest().fullyAuthenticated()
})
.build()
}
Есть идеи, что я делаю неправильно?
1 ответ
ЕСЛИ проблема в миграции, и до того, как вы это сделали, все работало отлично, проблема вinternalEndpointsFilterChain
конфигурация.
На основе Руководства по миграции
ОБНОВЛЯТЬ
Можете ли вы попробовать следующую реализацию и дать мне отзыв, если она вам поможет.
@Bean
@Order(10)
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable);
http.sessionManagement(sessionAuthenticationStrategy ->
sessionAuthenticationStrategy.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
http.securityMatcher("/cache/**")
.authorizeHttpRequests(request ->
request.anyRequest().fullyAuthenticated());
http.addFilterBefore(sharedSecretAuthenticationFilter(), ExceptionTranslationFilter.class);
http.exceptionHandling(exception -> exception.authenticationEntryPoint(new UnauthorizedAuthenticationEntryPoint()));
return http.build();
}