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?