Mit der Sicherheit um Ausnahmen in Spring Boot Resource Server
Wie kann ich meine benutzerdefinierte ResponseEntityExceptionHandler
oder OAuth2ExceptionRenderer
Exceptions ausgelöst von Spring security in einer reinen Ressourcen-server?
Implementierten wir eine
@ControllerAdvice
@RestController
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
also, Wann immer es ist ein Fehler auf der Ressourcen-server, die wir wollen, zu beantworten, mit
{
"message": "...",
"type": "...",
"status": 400
}
Den resource-server verwendet die Anwendung.Eigenschaften der Einstellung:
security.oauth2.resource.userInfoUri: http://localhost:9999/auth/user
zur Authentifizierung und Autorisierung einer Anfrage an unsere auth-server.
Jedoch keine spring security Fehler wird immer umgehen, unsere exception-handler bei
@ExceptionHandler(InvalidTokenException.class)
public ResponseEntity<Map<String, Object>> handleInvalidTokenException(InvalidTokenException e) {
return createErrorResponseAndLog(e, 401);
}
produzieren und entweder
{
"timestamp": "2016-12-14T10:40:34.122Z",
"status": 403,
"error": "Forbidden",
"message": "Access Denied",
"path": "/api/templates/585004226f793042a094d3a9/schema"
}
oder
{
"error": "invalid_token",
"error_description": "5d7e4ab5-4a88-4571-b4a4-042bce0a076b"
}
So, wie ich die Sicherheitseinstellungen konfigurieren exception-handling für ein Ressourcen-server? Alles, was ich jemals finden werden Beispiele auf, wie Sie die Auth-Server durch die Implementierung einer benutzerdefinierten OAuth2ExceptionRenderer
. Aber ich kann nicht finden, wo dieser Draht auf die Ressource server-security-Kette.
Unsere einzige Konfiguration/setup ist:
@SpringBootApplication
@Configuration
@ComponentScan(basePackages = {"our.packages"})
@EnableAutoConfiguration
@EnableResourceServer
- Gleiche Frage in http://stackoverflow.com/questions/19767267/handle-spring-security-authentication-exceptions-with-exceptionhandler?noredirect=1&lq=1
- Für OAuth2 Ausnahmen, siehe diese Frage: stackoverflow.com/q/45985310/2387977
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits in früheren Kommentaren wird der Antrag abgelehnt, mit dem security-framework, bevor es erreicht das MVC-Schicht, so
@ControllerAdvice
ist keine option hier.Gibt es 3 Schnittstellen in das Spring Security-framework von Interesse sein können, hier:
Können Sie erstellen, die Implementierungen der einzelnen Schnittstellen, um die Antwort anpassen, die gesendet wird für verschiedene Veranstaltungen: erfolgreicher login, login fehlgeschlagen, versuchen, Zugriff auf geschützte Ressource mit unzureichenden Berechtigungen.
Folgende wäre wieder eine JSON-Antwort von erfolglosen login-Versuch:
Müssen Sie auch die Registrierung Ihrer Umsetzung(s) mit dem Security framework. In Java-config sieht dies wie unten:
@EnableResourceServer
ich habe eine@Configuration
Klasse, wo ich Draht inhttp.exceptionHandling().accessDeniedHandler(restAccessDeniedHandler
, dies jedoch nicht fangen Sie das folgende:{ "error": "invalid_token", "error_description": "5d7e4ab5-4a88-4571-b4a4-042bce0a076b" }
Wie würden Sie dies tun?AuthenticationFailureHandler
wird verkabelt basiert auf einerloginProcessingUrl
. Ich glaube nicht, dass Sie würde haben, einer von denen, für eine@EnableResourceServer
. Wie sonst kann man den Draht in diesem?resolver.resolveException(request, response, null, exception);
innerhalb der MethodeonAuthenticationFailure
. Das zentrale exception handling.Im Falle dass, wenn Sie
@EnableResourceServer
ist, finden Sie auch bequem zu verlängernResourceServerConfigurerAdapter
stattWebSecurityConfigurerAdapter
in Ihrem@Configuration
Klasse. Indem wir dies tun, können Sie einfach registrieren Sie einen benutzerdefiniertenAuthenticationEntryPoint
durch überschreibenconfigure(ResourceServerSecurityConfigurer resources)
und mitresources.authenticationEntryPoint(customAuthEntryPoint())
innerhalb der Methode.Etwas wie dieses:
Gibt es auch eine nette
OAuth2AuthenticationEntryPoint
erweitert werden kann (da es nicht endgültig) und teilweise wieder verwendet, während die Implementierung einer benutzerdefiniertenAuthenticationEntryPoint
. Insbesondere, es fügt "WWW-Authenticate" - Header mit Fehler-bezogene Informationen.Können Sie nicht machen Verwendung von Spring MVC Exception-handler Anmerkungen, wie
@ControllerAdvice
da spring security Filter kicks viel vor Spring MVC.OAuth2ExceptionRenderer ist für einen Authorization Server. Die richtige Antwort ist wahrscheinlich, es zu handhaben, wie detailliert in diesem post (das ist, ignorieren, dass es oauth und behandeln Sie es wie jedes andere spring security authentication mechanism): https://stackoverflow.com/a/26502321/5639571
Natürlich, das fängt oauth Verwandte (Ausnahmen, die geworfen werden, bevor Sie erreichen Sie Ihre Ressource-Endpunkt), aber Ausnahmen passiert in Ihrem Ressource Endpunkt benötigen noch @ExceptionHandler Methode.
Wenn Sie token-Validierung-URL mit config ähnlich Konfigurieren von resource server mit RemoteTokenServices in Spring Security Oauth2 gibt den HTTP-status 401 bei unautorisierten:
Implementierung von benutzerdefinierten
authenticationEntryPoint
wie beschrieben in den anderen Antworten (https://stackoverflow.com/a/44372313/5962766) funktioniert nicht, weil RemoteTokenService verwenden Sie 400-status und wirft unbehandelte Ausnahmen für andere Zustände wie 401:So müssen Sie benutzerdefinierte
RestTemplate
imRemoteTokenServices
config das handhaben würde, 401, ohne dass Ausnahme:Hinzufügen und Abhängigkeit für HttpComponentsClientHttpRequestFactory:
Spring 3.0,die Sie verwenden können
@ControllerAdvice
(Auf Klassenebene) und erstreckt sichorg.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
Klasse ausCustomGlobalExceptionHandler