Настроить ответ об ошибке OAuth2 при аутентификации клиента с помощью Spring Security
Хотя это кажется легкой задачей, оказывается, что все наоборот. Я пытаюсь настроить обработку ошибок для запросов аутентификации клиента OAuth2. Цель этого - удалить трассировку / сообщение стека исключений из ответного сообщения.
контекстВанильная реализация Oauth2 Spring SecurityКонфигурация Java SpringШаги, предпринятые для выполнения задачиСоздать пользовательскую реализациюOAuth2ExceptionRenderer
Создать@Bean
экземплярOAuth2AuthenticationEntryPoint
@Bean
public OAuth2AuthenticationEntryPoint clientAuthEntryPoint()
{
OAuth2AuthenticationEntryPoint clientEntryPoint = new OAuth2AuthenticationEntryPoint();
clientEntryPoint.setTypeName("Basic");
clientEntryPoint.setRealmName("my-realm/client");
clientEntryPoint.setExceptionRenderer(new CustomOAuth2ExceptionRenderer());
return clientEntryPoint;
}
Создать обработчик отказа в доступе
@Bean
public OAuth2AccessDeniedHandler accessDeniedHandler()
{
OAuth2AccessDeniedHandler adh = new OAuth2AccessDeniedHandler();
adh.setExceptionRenderer(new CustomOAuth2ExceptionRenderer());
return adh;
}
УвеличитьAuthorizationServerSecurityConfigurer
среди прочего, с этими специализированнымиAuthorizationServerConfiguration
@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter
{
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
oauthServer.authenticationEntryPoint(clientAuthEntryPoint());
oauthServer.accessDeniedHandler(accessDeniedHandler());
oauthServer.realm("my-realm");
}
}
Запрос OAuth2Мы используем curl для инициации запросов OAuth2. Вот команда, которую мы используем для проверки подлинности клиента:
curl --insecure -H "Accept: application/json" -X POST -iu adfadsf:asdvadfgadf "https://localhost:8430/oauth/token?grant_type=password$username=john&pasword=johny"
Наблюдаемое поведениеПоскольку проверка подлинности клиента является обычной проверкой подлинности, Spring Security назначитBasicAuthenticationFilter
на этот шаг. Если в бэкэнде произошла ошибка, связанная с этим шагом (например, исключение SQL), Spring Security не получитOAuth2AuthenticationEntryPoint
и откатится к точке входа по умолчаниюBasicAuthenticationEntryPoint
.
o.s.s.authentication.ProviderManager : Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
o.s.s.w.a.www.BasicAuthenticationFilter : Authentication request for failed: org.springframework.security.authentication.InternalAuthenticationServiceException: show me the money
s.w.a.DelegatingAuthenticationEntryPoint : Trying to match using RequestHeaderRequestMatcher [expectedHeaderName=X-Requested-With, expectedHeaderValue=XMLHttpRequest]
s.w.a.DelegatingAuthenticationEntryPoint : No match found. Using default entry point org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint@649f92da
s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed```