2016-04-25 10 views
2

Wir verwenden die ACL-Anmerkungen von Spring Security, um den Zugriff auf bestimmte Webdienste zu ermöglichen. @PreAuthorize und @PostAuthorize scheint sehr nützlich zu sein und begünstigt die meisten Anwendungsfälle, die wir haben. Die SPEL-basierten Regeln für einzelne Methoden und andere helfen uns dabei, die Sicherheit der Anwendung und ihrer Dienste zu gewährleisten.Verwendung von Spring Security @Pre und @Post-Annotationen mit Sammlungen

Für zB: - Wir überprüfen den Besitzer eines zurückgegebenen Objekts wie unten

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.owner == authentication.name") 
public SomeDTO getSomeDTO(){ ... } 

Dies funktioniert gut, wenn ein einzelnes Objekt zurückgegeben wird. Was wäre das Äquivalent, wenn eine Liste zurückgegeben wird? Wie durchlaufen wir eine Sammlung und überprüfen einzelne Elementeigenschaften in dieser Sammlung mit SPEL?

Antwort

0

Probieren Sie den folgenden Ausdruck und siehe.

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.?[owner == authentication.name].size() == returnObject.size()") 
public List<SomeDTO> getSomeDTOs(){ ... } 

Siehe hierzu post.

+0

Dies scheint nicht zu funktionieren, aber die Dokumentation scheint echt zu sein. Lassen Sie mich mit einigen weiteren Beispielen versuchen und sehen – aksappy

1

Im Falle einer Sammlung sollten Sie @PreFilter und @PostFilter Anmerkungen verwenden.

Wenn die @PostFilter Anmerkung verwenden, iteriert Spring Security durch die zurückgegebene Sammlung und entfernt alle Elemente, für die der geliefert Ausdruck falsch ist. Der Name filterObject verweist auf das aktuelle Objekt in der Auflistung. Sie können auch vor dem Methodenaufruf mithilfe von @PreFilter filtern, obwohl dies eine weniger häufige -Anforderung ist.

Siehe das Beispiel unten oder finden Sie weitere Details here.

@PreAuthorize("hasRole('ROLE_ADMIN')") 
@PostFilter("filterObject.owner == authentication.name") 
public List<SomeDTO> getAll(); 
0

Es hängt von Ihren Bedürfnissen ab.

Wenn Sie nicht zulässige Objekte aus den Ergebnissen herausfiltern möchten, können Sie die Annotation @PostFilter verwenden, die die nicht übereinstimmenden Elemente herausfiltert. Beispiel (filterObject wird auf ein einzelnes Listenelement aus der Antwort gebunden):

@PostFilter("filterObject.owner == authentication.name") 
public List<SomeDTO> getAll(){ ... } 

Wenn Sie Absicht, das Ergebnis nur zurück, wenn alle Elemente erlaubt, @PostFilter wird dir nicht helfen, und Sie könnten versuchen, Verwendung der SPEL hasPermission Funktion innerhalb einer @PostAuthorize Annotation. Hat Berechtigung kann jede Art von Objekt erhalten und überprüfen Sie es logisch mit Ihrer benutzerdefinierten Implementierung (die Sie schreiben müssen). für ein Beispiel könnten Sie beziehen sich auf this example (section 4)