Мой 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?