перенести фильтр для определенных 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();
  }
Другие вопросы по тегам