Мой CustomOAuth2AuthenticationEntryPoint не вызывается для исключения JwtValidationException.

У меня есть серверная часть Spring Boot Rest, защищенная с помощью JWT, которая работает правильно с использованием oauth2ResourceServer, как описано ниже.

      @Bean
 public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  http
     .cors().configurationSource(corsConfigurationSource).and()
     .csrf().disable()  //Disable csrf, since we are using token based authentication, not cookie based
     .httpBasic(Customizer.withDefaults())
     .sessionManagement((session) -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
     //REF: https://mflash.dev/post/2021/01/19/error-handling-for-spring-security-resource-server/
     .exceptionHandling((exceptions) -> exceptions
        .authenticationEntryPoint(new CustomOAuth2AuthenticationEntryPoint())
        .accessDeniedHandler(new CustomOAuth2AccessDeniedHandler())
      )
     .oauth2ResourceServer()
     .jwt()
     .jwtAuthenticationConverter(authenticationConverter());
....

С точки зрения безопасности все работает нормально, и я получаю соответствующие ответы об ошибках от моего CustomOAuth2AuthenticationEntryPoint() для большинства «проблем».

Сюда входит ответ в формате JSON с подробной информацией о проблеме.

Однако, если срок действия токена истек или он был подделан, возникает исключение JwtValidationException, и это НЕ вызывает мойCustomOAuth2AuthenticationEntryPoint. Хотя это не представляет проблемы безопасности, поскольку я получаю ответ 401, в нем отсутствует дополнительная информация JSON .

Как я могу изменить это поведение, чтобы предоставить дополнительные сведения, аналогично тому, что сделано в моем CustomOAuth2AuthenticationEntryPoint? (Я включил в код ссылку на источник вдохновения для моей версии.) для ошибок, вызывающих исключение JwtValidationException ?

1 ответ

Наконец я обнаружил проблему, связанную с тем, как я изначально установил CustomOAuth2AuthenticationEntryPoint.

Если я заменю строки (данные в коде вопроса) на это:

                  .authenticationEntryPoint(new CustomOAuth2AuthenticationEntryPoint())
            .accessDeniedHandler(new CustomOAuth2AccessDeniedHandler())

Он работает нормально. Я не уверен, как я получил исходную версию, а также немного странно, что она работала для CustomOAuth2AccessDeniedHandler, но не для CustomOAuth2AuthenticationEntryPoint?

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