Выражение PermissionAll для Spring Security 6

Я пытаюсь переписать эти правила 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(). Знаете ли вы, как я могу это реализовать?

0
0
192
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно использовать авторизацию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, вот некоторая информация:

  1. http.securityMatchers против http.authorizeHttpRequests:

Конфигурация securityMatchers используется для предопределения, вводить ли вообще конкретный SecurityFilterChain или нет. Если он соответствует, и только тогда, то будут учитываться все остальные настройки для этого конкретного фильтра, будь то дополнительные ограничения маршрутов, конфигурации заголовков или CSRF.

authorizeHttpRequests будет обрабатывать определенные маршруты и разрешать или ограничивать вызовы. Он присоединяется после securityMatchers. Если securityMatchers не указан, то эта SecurityFilterChain будет обрабатывать все вызовы конечных точек. В таком случае этот SecurityFilterChain следует располагать последним.

  1. 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();
}

Другие вопросы по теме