2015-02-21 17 views
6

Essendo nuovo per le annotazioni di primavera, ho bisogno di un chiarimento per il codice sottostante.Come funzionano @PostFilter e @PreFilter

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

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

;

Questo significa che l'elenco di utenti restituiti da getUsers conterrà solo quegli elementi che hanno l'accesso completo "READ" all'oggetto chiamante o l'oggetto chiamante ha il ruolo come "ROLE_ADMIN". Grazie.

risposta

11

@PreFilter e @PostFilter sono progettati per essere utilizzati con Spring Security per poter filtrare raccolte o array in base all'autorizzazione.

Per avere questo lavoro, è necessario utilizzare il controllo di accesso basato su espressione nella sicurezza primavera (come si deve nel tuo esempio)

@PreFilter - filtra la raccolta o l'array prima di metodo di esecuzione.

@PostFilter - filtra la raccolta o gli array restituiti dopo l'esecuzione del metodo.

Quindi, supponiamo che il tuo getUser() restituisca Elenco utenti. Spring Security eseguirà l'iterazione dell'elenco e rimuoverà tutti gli elementi per cui l'espressione applicata è falsa (ad esempio non è admin e non dispone dell'autorizzazione di lettura)

filterObject è un oggetto incorporato su cui viene eseguita l'operazione di filtro ed è possibile applicare condizioni diverse a questo oggetto (in pratica tutte le espressioni built-in sono disponibili qui, ad esempio principal, authentication), ad esempio, si può fare

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

Anche se questi filtri sono utili, è davvero inefficiente con grandi insiemi di dati, e in pratica perdi il controllo sul risultato, invece Spring controlla il risultato.