2010-08-18 15 views
5

Sto sviluppando un'applicazione Web Grails (versione 1.3.3) utilizzando il plugin Grails Spring-Security, Spring-Security-Core-1.0.1 (che a sua volta , usa spring-security-3.0.2.RELEASE).Utilizzo di annotazioni Pre/Post Spring Security con Grails

Vorrei fornire il controllo degli accessi basato su annotazione Spring-Security sulle azioni all'interno di un controller.

sono stato in grado di fare con successo l'autenticazione di base con le seguenti annotazioni:

@Secured("hasAnyRole('ROLE_USER')") 
def list = { 
... 
} 

Questo funziona - fornire l'accesso alla lista azione/vista solo a quelli con il ruolo ROLE_USER.

Tuttavia, l'insieme dei ruoli autorizzati ad eseguire determinate azioni del controllore può cambiare nel tempo ed è una funzione dello stato complessivo del sistema. In altre parole, l'insieme dei ruoli autorizzati a eseguire una determinata azione potrebbe essere restituito da un servizio o da un metodo dell'oggetto dominio.

Un modo potrei essere in grado di fare qualcosa di simile sarebbe quella di utilizzare "Espressione Based Access Control" Primavera-Security (@Pre e @Post annotazioni), qualcosa come l'esempio alla Spring Security Documentation:

@PreAuthorize("hasPermission(#contact, 'admin')") 
public void deletePermission(Contact contact, Sid recipient, Permission permission); 

In questo esempio per le decisioni di controllo degli accessi, è possibile accedere agli oggetti inviati al metodo (ad es. Contatto) utilizzando la sintassi #contact.

Tuttavia, non riesco a ottenere le annotazioni @PreAuthorize (o @RolesAllowed) per lavorare su un'azione del controller Grails. Se io annotare l'azione lista con @PreAuthorize (piuttosto che @Secured, come sopra), ottengo il seguente errore:

Annotation @org.springframework.security.access.prepost.PreAuthorize is not allowed on element FIELD

Questo non è sorprendente - l'azione è una chiusura Groovy (un campo con codice eseguibile), piuttosto che un metodo. Tuttavia, ho anche provato con l'annotazione su metodi, chiamato dalla chiusura, come:

def list = { 
    testMethod() 
    .... 
    } 

    @PreAuthorize("hasRole('ROLE_USER')") 
    public boolean testMethod(){ 
    println "testMethod succeess" 
    return true; 
    } 

Anche se questo non genera gli eventuali errori, anche non sembra fornire alcun controllo di accesso. ("testMethod success" viene stampato indipendentemente dal fatto che l'utente abbia o meno ROLE_USER).

Quindi, ho provato alcune cose diverse (e ho letto la documentazione), ma non sono stato in grado di elaborare un buon modo di utilizzare le annotazioni @PreAuthorize con un'azione di controllo Grails. È possibile? C'è un modo migliore in un'app Grails di utilizzare le annotazioni Spring-Security per fornire il controllo degli accessi che è una funzione dello stato del sistema?

risposta

5

È necessario utilizzare lo ACL plugin per utilizzare tali annotazioni, ma non funzioneranno sulle azioni del controller per i motivi indicati. @Secured funziona perché ho creato una copia dell'annotazione Spring Security che consente di posizionarla su campi, nonché metodi e classi, e li cerco e li collego esplicitamente. Dovrai utilizzare i servizi annotati che chiami dai tuoi controllori.

Problemi correlati