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 requestWir 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
.
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```