2012-11-06 1 views
8

Wir verwenden Spring Security 3.1.3-RELEASE mit Sicherheit auf Methodenebene. Es funktioniert perfekt.Wie erhält man den 'Grund'/die Ursache für eine AccessDeniedException in Spring Security?

Ich würde gerne anmelden und vielleicht dem Benutzer zeigen, warum er Zugriff verweigert wird.

Mit einer org.springframework.security.web.access.AccessDeniedHandlerImpl Unterklasse, kann ich einen Verweis auf die org.springframework.security.access.AccessDeniedException geworfen, aber ich kann nicht einen Weg, um zu bestimmen, was sie verursachte (zB ‚Fehlende Rolle ROLE_ADMIN‘ oder etwas in diesem Sinne) finden.

Fehle ich etwas, oder existiert es einfach nicht?

+0

gleiche Problem hier. Es wäre schön, wenn AccessDecisionVoters nicht nur ACCESS_GRANTED oder ACCESS_DENIED zurückgibt, sondern eine AccessDeniedDecision zurückgibt, die einen Grund/Ursache enthalten kann – Janning

+1

Ich habe ein Jira-Problem erstellt: https://jira.springsource.org/browse/SEC-2148 – Janning

Antwort

4

Leider ist dies nicht möglich mit Standardimplementierungen, die in Spring Security verfügbar sind.

Ich untersuchte Quellcode und ...

MethodSecurityInterceptor zum Schutz von Aufrufen von Prozeduren verantwortlich ist. Es delegiert Zugriffsentscheidungen an AccessDecisionManager. Ich überprüfte jede Implementierung von AccessDecisionManager out of box.

  • AffirmativeBased
  • ConsensusBased
  • UnanimousBased

Jeder von ihnen wirft AccessDeniedException Ausnahme in ähnlicher Weise.

case AccessDecisionVoter.ACCESS_DENIED: 
       throw new AccessDeniedException(
         messages.getMessage("AbstractAccessDecisionManager.accessDenied", 
         "Access is denied") 
       ); 

AbstractAccessDecisionManager.accessDenied ist der Name der Nachricht, die lokalisiert werden kann.

für Englisch ist es:

AbstractAccessDecisionManager.accessDenied=Access is denied 

Es gibt mehrere Sprachen aus der Box, und Sie können Sie Übersetzungen besitzen, aber ...

das alles ist, nicht mehr Informationen über Gründe Ausnahme.

Mehr Informationen über die Lokalisierung von Ausnahmemeldungen:

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization

0

Ich habe auch ein jira Problem dafür: https://jira.spring.io/browse/SEC-3104

@PreAuthorize, @PostAuthorize, @Secured Annotation einen Parameter benutzerdefinierte Nachricht Eigenschaft haben, um kann Punkt zu setzen detaillierte & benutzerfreundlichere Ausnahmemeldungen.

Dies könnte auch getan werden, indem ein param. Um einen Klassennamen zu definieren, der AccessDeniedException erweitert, um Sie zu erhöhen, lassen Sie die Benutzer den Rest erledigen.

Auf diese Weise, während komplexe Regeln wie

Verarbeitung

@PreAuthorize("record.createuser != authentication.getName()")

Wir können einen definierten Fehler wie

"You cannot process a record that you created."" usw. erhalten statt "Access is denied"