Я пытаюсь переписать эти правила Spring Security 5:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests().antMatchers("/").permitAll();
}
В Spring Security 6:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.securityMatchers(matchers -> matchers
.requestMatchers(RegexRequestMatcher.regexMatcher("/"))).csrf(CsrfConfigurer::disable);
return http.build();
}
Не могу найти, куда добавить .permitAll(). Знаете ли вы, как я могу это реализовать?
Вам нужно использовать авторизациюHttpRequests
http.authorizeHttpRequests(registry -> registry.requestMatchers("/", "/login", "/api/v1/actuator/**", ).permitAll()
В Spring Security 6 способ указания правил авторизации, таких как .permitAll(), немного изменился по сравнению с более ранними версиями. Вот как вы можете интегрировать его в конфигурацию bean-компонента SecurityFilterChain:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(CsrfConfigurer::disable)
.authorizeHttpRequests((authz) -> authz
.requestMatchers("/").permitAll());
return http.build();
}
В этом фрагменте метод авторизацииHttpRequests() используется для настройки авторизации на основе запроса. В этом методе requestMatchers("/") указывает путь, а .permitAll() применяется, чтобы сделать его доступным без аутентификации.
Поскольку это, похоже, дополнительный вопрос к Невозможно разрешить метод «regexMatcher» в «HttpSecurity» и вы как бы боретесь с обновлением до Spring Security 6, вот некоторая информация:
Конфигурация securityMatchers используется для предопределения, вводить ли вообще конкретный SecurityFilterChain или нет. Если он соответствует, и только тогда, то будут учитываться все остальные настройки для этого конкретного фильтра, будь то дополнительные ограничения маршрутов, конфигурации заголовков или CSRF.
authorizeHttpRequests будет обрабатывать определенные маршруты и разрешать или ограничивать вызовы. Он присоединяется после securityMatchers. Если securityMatchers не указан, то эта SecurityFilterChain будет обрабатывать все вызовы конечных точек. В таком случае этот SecurityFilterChain следует располагать последним.
MvcRequestMatcher — это стандартное средство сопоставления, используемое Spring MVC. Это собственное творение Spring, и оно лучше всего подходит, когда это возможно. AntMatcher — это пережиток Apache Ant Project, и его следует использовать только при необходимости, например, база данных H2 все еще использует это сопоставление. RegexRequestMatcher — это средство сопоставления регулярных выражений, как следует из названия, и оно требует немного больше ресурсов, но дает вам более широкие возможности для указания маршрутов, хотя его также следует использовать только при необходимости.Теперь, чтобы подвести итог вашему вопросу и привести реальный пример с тремя SecurityFilterChain методами: один для ресурсов, один для базы данных H2, используемой во время разработки, и один, который обрабатывает все остальные конечные точки, вот фрагмент кода, который должен прояснить некоторые вещи. немного выше:
/**
* {@link SecurityFilterChain} for H2 database requests only.
*
* <p>Spring MVC requestMatchers() uses by default {@link MvcRequestMatcher}. Since the H2 console
* is not controlled by Spring MVC, we must force Spring Security 6 to use AntPathRequestMatcher.
*
* @return a configured {@link SecurityFilterChain} for H2 database requests
*/
@Bean
@Order(10)
@Profile("development")
public SecurityFilterChain h2FilterChain(HttpSecurity http,
@Value("${spring.h2.console.path:/h2-console}") String h2ConsolePath) throws Exception {
return http
.securityMatchers(matchers -> matchers
/* https://github.com/spring-projects/spring-security/issues/12546#issuecomment-1382891839 */
.requestMatchers(AntPathRequestMatcher.antMatcher(h2ConsolePath + "/**")))
.authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll())
/* The H2 console runs in a frameset. Thus, we need to set 'X-Frame-Options' from 'deny' to 'sameOrigin'. */
.headers(header -> header.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
/* Otherwise login into H2 won't work. */
.csrf(CsrfConfigurer::disable)
.build();
}
/**
* {@link SecurityFilterChain} for resources only.
*
* @return a configured {@link SecurityFilterChain} for resource requests
*
* @see <a href = "https://github.com/spring-projects/spring-security/issues/10938#issuecomment-1062359527">
* Don't use WebSecurityCustomizer for web.ignoring()</a>
*/
@Bean
@Order(20)
public SecurityFilterChain resourceFilterChain(HttpSecurity http) throws Exception {
return http
.securityMatchers(matchers -> matchers
.requestMatchers("/favicon.ico",
"/css/**",
"/fonts/**",
"/img/**",
"/js/**",
"/webjars/**"))
.authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll())
.requestCache(RequestCacheConfigurer::disable)
.securityContext(SecurityContextConfigurer::disable)
.sessionManagement(SessionManagementConfigurer::disable)
.build();
}
@Bean
@Order(30)
public SecurityFilterChain mvcFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(authorize -> authorize
.shouldFilterAllDispatcherTypes(true)
.dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll()
.requestMatchers("/", "/error/**").permitAll()
.requestMatchers("/secrets/**").authenticated()
/* more requestMatchers here to come */
.anyRequest().denyAll())
.csrf(CsrfConfigurer::disable)
.build();
}