6

Da ich neu in Springnotizen bin, brauche ich eine Klarstellung für den folgenden Code.Wie funktionieren @PostFilter und @PreFilter?

@PostFilter("hasPermission(filterObject, 'READ') or hasRole('ROLE_ADMIN')") 

    public List<User> getUsers(String orderByInsertionDate, 
      Integer numberDaysToLookBack) throws AppException 

;

Das bedeutet also, dass die Liste der von getUsers zurückgegebenen Benutzer nur solche Elemente enthält, die vollen Zugriff auf das aufrufende Objekt haben oder das aufrufende Objekt die Rolle "ROLE_ADMIN" hat. Vielen Dank.

Antwort

11

@PreFilter und @PostFilter sind für die Verwendung mit Spring-Sicherheit vorgesehen, um Sammlungen oder Arrays basierend auf der Autorisierung filtern zu können.

diese Funktion haben, müssen Sie die Expression-basierte Zugriffskontrolle im Frühjahr Sicherheit verwenden (wie Sie in Ihrem Beispiel haben)

@PreFilter - filtert die Sammlung oder Arrays vor Methode ausgeführt wird.

@PostFilter - filtert die zurückgegebene Sammlung oder Arrays nach dem Ausführen der Methode.

Also, lassen Sie uns sagen Ihre getUser() gibt Liste der Benutzer zurück. Spring Security durchläuft die Liste und entfernt alle Elemente, für die der angewendete Ausdruck falsch ist (z. B. ist nicht admin und hat keine Leseberechtigung)

filterObject ist ein integriertes Objekt, auf dem die Filteroperation ausgeführt wird und Sie können gelten verschiedene Bedingungen auf dieses Objekt (im Grunde alle Einbau-Ausdrücke hier zur Verfügung stehen, zB principal, authentication), zum Beispiel können Sie tun

@PostFilter ("filterObject.owner == authentication.name") 

Obwohl diese Filter nützlich sind, ist es mit großen Datenmengen wirklich ineffizient ist, und im Grunde verlieren Sie die Kontrolle über Ihr Ergebnis, stattdessen steuert Spring das Ergebnis.

Verwandte Themen