Ich möchte eine Klasse erstellen, die benutzerdefinierte Methoden zur Verwendung in der Spring Security-Ausdruckssprache für die methodenbasierte Autorisierung über Anmerkungen hinzufügt.
Zum Beispiel möchte ich eine benutzerdefinierte Methode wie 'customMethodReturningBoolean' erstellen, die irgendwie wie folgt verwendet wird:
@PreAuthorize("customMethodReturningBoolean()")
public void myMethodToSecure() {
// whatever
}
Meine Frage ist dies. Wenn es möglich ist, welche Klasse sollte ich zum Erstellen meiner benutzerdefinierten Methoden unterordnen, wie würde ich vorgehen, um sie in den XML-Konfigurationsdateien von spring zu konfigurieren, und jemand würde mir ein Beispiel für eine benutzerdefinierte Methode geben, die auf diese Weise verwendet wird?
java
spring
spring-security
Paul D. Eden
quelle
quelle
Antworten:
Sie müssen zwei Klassen unterordnen.
Legen Sie zunächst einen neuen Methodenausdruck-Handler fest
myMethodSecurityExpressionHandler
wird eine Unterklasse sein,DefaultMethodSecurityExpressionHandler
die überschreibtcreateEvaluationContext()
und eine Unterklasse vonMethodSecurityExpressionRoot
auf dem setztMethodSecurityEvaluationContext
.Beispielsweise:
quelle
MethodSecurityExpressionRoot
sein Paket-private ?Keine der genannten Techniken funktioniert mehr. Es scheint, als hätte Spring große Anstrengungen unternommen, um zu verhindern, dass Benutzer den SecurityExpressionRoot überschreiben.
EDIT 19.11.14 Setup Spring zur Verwendung von Sicherheitsanmerkungen:
Erstellen Sie eine Bohne wie folgt:
Dann mach so etwas in deinem jsp:
Oder kommentieren Sie eine Methode:
Darüber hinaus können Sie in Ihren Anmerkungen Spring Expression Language verwenden,
@PreAuthorize
um auf die aktuelle Authentifizierung sowie auf Methodenargumente zuzugreifen.Beispielsweise:
Aktualisieren Sie dann Ihre
@PreAuthorize
, um sie an die neue Methodensignatur anzupassen:quelle
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
das aktuelle Authentifizierungstoken abrufen.Danke ericacm , aber es funktioniert aus einigen Gründen nicht:
Die Unterschiede bestehen darin, dass wir die vorhandene Methode createEvaluationContext aufrufen und dann unser benutzerdefiniertes Stammobjekt hinzufügen. Schließlich habe ich gerade einen StandardEvaluationContext- Objekttyp zurückgegeben, da MethodSecurityEvaluationContext im Compiler nicht aufgelöst werden würde (beide stammen von derselben Schnittstelle). Dies ist der Code, den ich jetzt in der Produktion habe.
Lassen Sie MethodSecurityExpressionHandler unser benutzerdefiniertes Stammverzeichnis verwenden:
Dies ersetzt das Standardstammverzeichnis durch die Erweiterung von SecurityExpressionRoot . Hier habe ich hasRole in hasEntitlement umbenannt:
Aktualisieren Sie abschließend securityContext.xml (und stellen Sie sicher, dass in Ihrer applcationContext.xml darauf verwiesen wird):
Hinweis: Die Annotation @Secured akzeptiert diese Überschreibung nicht, da sie einen anderen Validierungshandler durchläuft. Also habe ich sie in der obigen XML deaktiviert, um spätere Verwirrung zu vermeiden.
quelle