Вот соответствующий фрагмент кода:
Код: Выделить всё
@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 {
...
}
}
[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)
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
Мобильная версия