Wie erhält man den 'Grund' / die Ursache für eine AccessDeniedException in Spring Security?

8

Wir verwenden Spring Security 3.1.3-RELEASE mit Sicherheit auf Methodenebene. Es funktioniert perfekt.

Ich möchte mich anmelden und dem Benutzer möglicherweise zeigen, warum ihm der Zugriff verweigert wird.

Wenn ich eine org.springframework.security.web.access.AccessDeniedHandlerImpl Unterklasse verwende, kann ich einen Verweis auf das org.springframework.security.access.AccessDeniedException erhalten, aber ich kann keinen Weg finden um herauszufinden, was das verursacht hat (zB 'Fehlende Rolle ROLE_ADMIN' oder etwas in diesem Sinne).

Fehle ich etwas oder existiert es einfach nicht?

    
Ricardo Pardini 06.11.2012, 18:08
quelle

2 Antworten

4

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

Ich habe Quellcode untersucht und ...

MethodSecurityInterceptor ist verantwortlich für den Schutz von Methodenaufrufen. Er delegiert Zugriffsentscheidungen an AccessDecisionManager . Ich habe jede Implementierung von AccessDecisionManager out of box geprüft.

  • AffirmativeBased
  • Konsensbasiert
  • EinstimmigBasiert

Jeder von ihnen löst AccessDeniedException Ausnahme auf ähnliche Weise aus.

%Vor%

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

Für Englisch ist es:

%Vor%

Es sind mehrere Sprachen verfügbar, und Sie können eigene Übersetzungen erstellen, aber ...

Das ist alles, keine weiteren Informationen über Gründe der Ausnahme.

Weitere Informationen zur Lokalisierung von Ausnahmemeldungen:

Ссылка

    
Maciej Ziarko 06.11.2012 19:05
quelle
0

Ich habe auch ein jira-Problem dafür erstellt: Ссылка

@PreAuthorize, @PostAuthorize, @Secured Annotation kann einen Parameter haben, um auf die Eigenschaft für benutzerdefinierte Nachrichten zu zeigen, um detaillierte & amp; benutzerfreundlichere Ausnahmemeldungen.

Dies könnte auch durch Angabe eines Parameters erfolgen. Um einen Klassennamen zu definieren, der AccessDeniedException erweitert, um ihn zu erhöhen, können Benutzer den Rest behandeln.

Auf diese Weise können komplexe Regeln wie

verarbeitet werden

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

Wir können einen definierten Fehler wie

bekommen

"You cannot process a record that you created."" usw. anstelle von "Access is denied"

    
Gokhan Oner 10.09.2015 12:27
quelle