Настроить ответ об ошибке 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```

Ответы на вопрос(1)

Ваш ответ на вопрос