Несколько SecurityFilterChain всегда возвращают одну и ту же ошибкуJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Несколько SecurityFilterChain всегда возвращают одну и ту же ошибку

Сообщение Anonymous »

Я столкнулся с проблемой в моей конфигурации Spring Security, из-за которой пути запросов всегда соответствуют первому SecurityFilterChain, несмотря на то, что я использую аннотацию u/Order.
Вот соответствующий фрагмент кода:

Код: Выделить всё

@Order(1)
public SecurityFilterChain apiKeySecurityFilterChain(HttpSecurity http) throws Exception {
return http
.securityMatcher("/api/notifications/**")  // Only matches notifications paths
.csrf(csrf -> csrf.disable())
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()))
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authenticationProvider)
.addFilterBefore(apiKeyAuthFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}

@Bean
@Order(2)
public SecurityFilterChain jwtSecurityFilterChain(HttpSecurity http) throws Exception {
return http
.securityMatcher("/api/**")  // Matches all other API paths
.csrf(csrf -> csrf.disable())
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/api/auth/**").permitAll()  // Allow access to auth paths
.anyRequest().authenticated()              // Authenticate all other requests
)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}

Код: Выделить всё

@Component
public class ApiKeyAuthFilter extends OncePerRequestFilter {
…
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws IOException, ServletException {

String requestApiKey = request.getHeader("X-API-KEY");
String requestApiSecret = request.getHeader("X-API-SECRET");
// Validate the key and secret
if (apiKey.equals(requestApiKey) && apiSecret.equals(requestApiSecret)) {
// Continue processing the request
filterChain.doFilter(request, response);
} else {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.getWriter().write("Unauthorized test");
}
}
}

Код: Выделить всё

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
...
@Override
protected void doFilterInternal(
@NonNull HttpServletRequest request,
@NonNull HttpServletResponse response,
@NonNull FilterChain filterChain
) throws ServletException, IOException {
...
}
}
Из Spring Security у меня должна быть возможность иметь несколько SecurityFilterChain.
[img]https:// i.sstatic.net/jLvDMjFd.png[/img]

Проблема:
Независимо от того, какой путь я использую мои запросы, кажется, они всегда направляются в apiKeySecurityFilterChain (порядок 1). Я ожидал, что запросы к путям, не соответствующим "/api/notifications/**", будут обрабатываться jwtSecurityFilterChain (порядок 2), но этого не происходит.
Итак , всякий раз, когда я отправляю путь запроса, он всегда возвращает ошибку «Несанкционированный тест»
Журнал приложения – не уверен, связано ли это

Код: Выделить всё

2024-10-03T14:33:20.340-07:00 DEBUG 75740 --- [backend] [nio-8005-exec-1] o.s.security.web.FilterChainProxy        : Securing POST /auth/login/app
2024-10-03T14:33:20.346-07:00 DEBUG 75740 --- [backend] [nio-8005-exec-1] o.s.s.w.a.AnonymousAuthenticationFilter  : Set SecurityContextHolder to anonymous SecurityContext
2024-10-03T14:33:20.346-07:00 DEBUG 75740 --- [backend] [nio-8005-exec-1] o.s.s.w.session.SessionManagementFilter  : Request requested invalid session id 8F392A25E730ADD3CD98B2175C2693B5
Что я пробовал
Первое
Я пытался закомментировать

Код: Выделить всё

  .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
в jwtSecurityFilterChain, и он, наконец, не возвращает «Несанкционированный тест». Мне интересно, не потому ли это, что оба фильтра используют @Overide для метода doFilterInternal?
2nd
Странно то, что я пытаюсь прокомментировать метод apiKeySecurityFilterChain, но он все равно выдает ту же ошибку «Несанкционированный тест», хотя apiKeyAuthFilter не применяется.

Код: Выделить всё

//@Order(1)
//public SecurityFilterChain apiKeySecurityFilterChain(HttpSecurity http) throws Exception //{
//    return http
//            .securityMatcher("/api/notifications/**")  // Only matches notifications //paths
//           .csrf(csrf -> csrf.disable())
//           .cors(httpSecurityCorsConfigurer -> //httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()))
//            .sessionManagement(session -> //session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
//            .authenticationProvider(authenticationProvider)
//            .addFilterBefore(apiKeyAuthFilter, //UsernamePasswordAuthenticationFilter.class)
//          .build();
//}

@Bean
@Order(2)
public SecurityFilterChain jwtSecurityFilterChain(HttpSecurity http) throws Exception {
return http
.securityMatcher("/api/**")  // Matches all other API paths
.csrf(csrf -> csrf.disable())
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/api/auth/**").permitAll()  // Allow access to auth paths
.anyRequest().authenticated()              // Authenticate all other requests
)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
Еще более странно: с тем же кодом, что и выше, ошибка исчезает, когда я закомментирую
Весь класс фильтра ниже

Код: Выделить всё

// All commented out
//@Component
//public class JwtAuthenticationFilter extends OncePerRequestFilter {
//  ...
//  @Override
//  protected void doFilterInternal(
//          @NonNull HttpServletRequest request,
//           @NonNull HttpServletResponse response,
//           @NonNull FilterChain filterChain
//   ) throws ServletException, IOException {
//       ...
//   }
//}
Вопрос
Что может быть причиной этой проблемы с маршрутизацией в моей конфигурации Spring Security и как я могу гарантировать, что запросы правильно направляются в соответствующий SecurityFilterChain на основе их пути?

Подробнее здесь: https://stackoverflow.com/questions/790 ... same-error
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»