Anpassen der OAuth2-Fehlerantwort bei der Clientauthentifizierung mit Spring Security

Während dies eine einfache Aufgabe zu sein scheint, stellt sich das Gegenteil heraus. Ich versuche, die Fehlerbehandlung für OAuth2-Clientauthentifizierungsanforderungen anzupassen. Der Zweck dieses Befehls besteht darin, die Ausnahmestapelverfolgung / -nachricht aus der Antwortnachricht zu entfernen.

Kontexvanilla Oauth2 Spring Security ImplementierungJava Spring KonfigurationSteps genommen, um die Aufgabe zu erfüllenErstelle eine benutzerdefinierte Implementierung vonOAuth2ExceptionRenderer

Ein ... kreieren@Bean Instanz vonOAuth2AuthenticationEntryPoint

@Bean
public OAuth2AuthenticationEntryPoint clientAuthEntryPoint()
{
    OAuth2AuthenticationEntryPoint clientEntryPoint = new OAuth2AuthenticationEntryPoint();
    clientEntryPoint.setTypeName("Basic");
    clientEntryPoint.setRealmName("my-realm/client");
    clientEntryPoint.setExceptionRenderer(new CustomOAuth2ExceptionRenderer());
    return clientEntryPoint;
}

Erstelle einen Access Denied Handler

@Bean
public OAuth2AccessDeniedHandler accessDeniedHandler()
{
    OAuth2AccessDeniedHandler adh = new OAuth2AccessDeniedHandler();
    adh.setExceptionRenderer(new CustomOAuth2ExceptionRenderer());
    return adh;
}

Augment theAuthorizationServerSecurityConfigurer unter anderem mit diesen spezialisierten Implementierungen inAuthorizationServerConfiguration

@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 request

Wir verwenden curl, um OAuth2-Anfragen zu initiieren. Hier ist der Befehl, mit dem wir die Client-Authentifizierung testen:

curl --insecure -H "Accept: application/json" -X POST -iu adfadsf:asdvadfgadf "https://localhost:8430/oauth/token?grant_type=password$username=john&pasword=johny"
Beobachtetes Verhalten

Da es sich bei der Clientauthentifizierung um eine Standardauthentifizierung handelt, weist Spring Security ein @ zBasicAuthenticationFilter zu diesem Schritt. Wenn im Backend ein Fehler in Bezug auf diesen Schritt auftritt (z. B. eine SQL-Ausnahme), erkennt Spring Security das @ nichOAuth2AuthenticationEntryPoint und wird auf einen Standardeinstiegspunkt @ zurückgreifBasicAuthenticationEntryPoint.

Logs
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```

Antworten auf die Frage(2)

Ihre Antwort auf die Frage