Spring фильтр безопасности выполняется, когда он не нужен ⇐ JAVA
Spring фильтр безопасности выполняется, когда он не нужен
При выполнении запроса к /api/v1/auth/authenticate с действительным телом мой почтальон получает файл cookie с именем token и значением jwt. Срок действия токена истекает через 20 минут, когда он истекает, и я запускаю вызов с точным телом, и на этот раз с файлом cookie он отклоняется, говоря, что, по сути, срок действия файла cookie истек, и это правда. Но эту конечную точку не нужно аутентифицировать, как я установил в файле конфигурации безопасности. Что происходит?
Я также хочу добавить, что при изменении имени файла cookie в Postman запрос принимается, и мой ответ получает новый файл cookie с именем token, а также при удалении файла cookie он также принимается.
Контроллер аутентификации:
@RestController @RequestMapping("/api/v1/auth/") @RequiredArgsConstructor общественный класс AuthenticationController { частная окончательная служба аутентификации Служба аутентификации; @PostMapping("/регистр") общедоступный регистр ResponseEntity(@RequestPart("user") UserSignUpDto user, @RequestPart("inpFile") MultipartFile ProfilePicture) { return ResponseEntity.ok(authenticationService.register(user, ProfilePicture)); } @PostMapping("/аутентификация") public ResponseEntity аутентификация(запрос @RequestBody UserLogInDto, Ответ HttpServletResponse) { return ResponseEntity.ok(authenticationService.authenticate(запрос, ответ)); } @ExceptionHandler(ResponseStatusException.class) public ResponseEntity handleConflictError (исключение ResponseStatusException) { // нужно выяснить ResponseStatusException вернуть ResponseEntity.status(Exception.getStatusCode()).body(исключение); } } Конфигурация безопасности:
@Configuration @EnableWebSecurity @RequiredArgsConstructor общественный класс SecurityConfiguration { частный окончательный JwtAuthenticationFilter jwtAuthenticationFilter; частный окончательный AuthenticationProvider authProvider; @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .cors(Customizer.withDefaults()) .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> { auth.requestMatchers("/api/v1/auth/**").permitAll(); auth.requestMatchers("/home/**").permitAll(); auth.requestMatchers("/user/**").permitAll(); auth.requestMatchers("/picture/**").permitAll(); auth.anyRequest().аутентифицированный(); }) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authenticationProvider(authProvider) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); вернуть http.build(); } @Бин CorsConfigurationSource corsConfigurationSource() { Конфигурация CorsConfiguration = новая CorsConfiguration(); Configuration.setAllowedOrigins(List.of("http://localhost:4200")); Configuration.setAllowCredentials(истина); Configuration.setAllowedMethods(List.of("GET", "POST")); Configuration.setAllowedHeaders(List.of("Content-Type")); Источник UrlBasedCorsConfigurationSource = новый UrlBasedCorsConfigurationSource (); source.registerCorsConfiguration("/**", конфигурация); источник возврата; } } JwtAuthenticationFilter:
@Component @RequiredArgsConstructor общественный класс JwtAuthenticationFilter расширяет OncePerRequestFilter { частный окончательный JwtService jwtService; частный окончательный UserDetailsService userDetailsService; @Override protected void doFilterInternal( // todo: попросите ChatGPT объяснить это Запрос @NonNull HttpServletRequest, Ответ @NonNull HttpServletResponse, @NonNull FilterChain filterChain ) выдает ServletException, IOException { конечная строка userEmail; конечная строка jwt; окончательный файл cookie jwtCookie = request.getCookies() != null ? Arrays.stream(request.getCookies()).filter(cookie -> cookie.getName().equals("токен")) .findFirst() .orElse(null): ноль; если (jwtCookie == ноль) { filterChain.doFilter(запрос, ответ); возвращаться; } jwt = jwtCookie.getValue(); userEmail = jwtService.extractUsername(jwt); // чтобы извлечь токен userEmail; если (userEmail != ноль && SecurityContextHolder.getContext().getAuthentication() == null) { UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail); если (jwtService.isTokenValid(jwt, userDetails)) { UsernamePasswordAuthenticationToken authToken = новый UsernamePasswordAuthenticationToken( данные пользователя, нулевой, userDetails.getAuthorities() ); authToken.setDetails(новый WebAuthenticationDetailsSource().buildDetails(запрос)); SecurityContextHolder.getContext().setAuthentication(authToken); } } filterChain.doFilter(запрос, ответ); } }
При выполнении запроса к /api/v1/auth/authenticate с действительным телом мой почтальон получает файл cookie с именем token и значением jwt. Срок действия токена истекает через 20 минут, когда он истекает, и я запускаю вызов с точным телом, и на этот раз с файлом cookie он отклоняется, говоря, что, по сути, срок действия файла cookie истек, и это правда. Но эту конечную точку не нужно аутентифицировать, как я установил в файле конфигурации безопасности. Что происходит?
Я также хочу добавить, что при изменении имени файла cookie в Postman запрос принимается, и мой ответ получает новый файл cookie с именем token, а также при удалении файла cookie он также принимается.
Контроллер аутентификации:
@RestController @RequestMapping("/api/v1/auth/") @RequiredArgsConstructor общественный класс AuthenticationController { частная окончательная служба аутентификации Служба аутентификации; @PostMapping("/регистр") общедоступный регистр ResponseEntity(@RequestPart("user") UserSignUpDto user, @RequestPart("inpFile") MultipartFile ProfilePicture) { return ResponseEntity.ok(authenticationService.register(user, ProfilePicture)); } @PostMapping("/аутентификация") public ResponseEntity аутентификация(запрос @RequestBody UserLogInDto, Ответ HttpServletResponse) { return ResponseEntity.ok(authenticationService.authenticate(запрос, ответ)); } @ExceptionHandler(ResponseStatusException.class) public ResponseEntity handleConflictError (исключение ResponseStatusException) { // нужно выяснить ResponseStatusException вернуть ResponseEntity.status(Exception.getStatusCode()).body(исключение); } } Конфигурация безопасности:
@Configuration @EnableWebSecurity @RequiredArgsConstructor общественный класс SecurityConfiguration { частный окончательный JwtAuthenticationFilter jwtAuthenticationFilter; частный окончательный AuthenticationProvider authProvider; @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .cors(Customizer.withDefaults()) .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> { auth.requestMatchers("/api/v1/auth/**").permitAll(); auth.requestMatchers("/home/**").permitAll(); auth.requestMatchers("/user/**").permitAll(); auth.requestMatchers("/picture/**").permitAll(); auth.anyRequest().аутентифицированный(); }) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authenticationProvider(authProvider) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); вернуть http.build(); } @Бин CorsConfigurationSource corsConfigurationSource() { Конфигурация CorsConfiguration = новая CorsConfiguration(); Configuration.setAllowedOrigins(List.of("http://localhost:4200")); Configuration.setAllowCredentials(истина); Configuration.setAllowedMethods(List.of("GET", "POST")); Configuration.setAllowedHeaders(List.of("Content-Type")); Источник UrlBasedCorsConfigurationSource = новый UrlBasedCorsConfigurationSource (); source.registerCorsConfiguration("/**", конфигурация); источник возврата; } } JwtAuthenticationFilter:
@Component @RequiredArgsConstructor общественный класс JwtAuthenticationFilter расширяет OncePerRequestFilter { частный окончательный JwtService jwtService; частный окончательный UserDetailsService userDetailsService; @Override protected void doFilterInternal( // todo: попросите ChatGPT объяснить это Запрос @NonNull HttpServletRequest, Ответ @NonNull HttpServletResponse, @NonNull FilterChain filterChain ) выдает ServletException, IOException { конечная строка userEmail; конечная строка jwt; окончательный файл cookie jwtCookie = request.getCookies() != null ? Arrays.stream(request.getCookies()).filter(cookie -> cookie.getName().equals("токен")) .findFirst() .orElse(null): ноль; если (jwtCookie == ноль) { filterChain.doFilter(запрос, ответ); возвращаться; } jwt = jwtCookie.getValue(); userEmail = jwtService.extractUsername(jwt); // чтобы извлечь токен userEmail; если (userEmail != ноль && SecurityContextHolder.getContext().getAuthentication() == null) { UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail); если (jwtService.isTokenValid(jwt, userDetails)) { UsernamePasswordAuthenticationToken authToken = новый UsernamePasswordAuthenticationToken( данные пользователя, нулевой, userDetails.getAuthorities() ); authToken.setDetails(новый WebAuthenticationDetailsSource().buildDetails(запрос)); SecurityContextHolder.getContext().setAuthentication(authToken); } } filterChain.doFilter(запрос, ответ); } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение