Je développe une application Web Grails (Version 1.3.3) à l'aide du plug-in Grails Spring-Security, Spring-Security-Core-1.0.1 (qui, à son tour , utilise spring-security-3.0.2.RELEASE).Utilisation d'annotations de sécurité avant/après avec des paliers
Je voudrais fournir un contrôle d'accès basé sur des annotations Spring-Security sur les actions au sein d'un contrôleur.
Je suis en mesure de le faire avec succès l'authentification de base en utilisant les annotations suivantes:
@Secured("hasAnyRole('ROLE_USER')")
def list = {
...
}
Cela fonctionne - l'accès à l'action/vue liste seulement à ceux qui ont le rôle de ROLE_USER. Cependant, l'ensemble des rôles autorisés à exécuter certaines actions du contrôleur peut changer dans le temps et est fonction de l'état global du système. C'est-à-dire que l'ensemble des rôles autorisés à effectuer une action donnée peut être renvoyé par une méthode de service ou d'objet-domaine.
Une façon je pourrais être en mesure de faire quelque chose comme cela serait d'utiliser « Expression Based Access Control » Spring-sécurité (annotations @Pre et @post), quelque chose comme l'exemple à l'Spring Security Documentation:
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
Dans cet exemple de décision de contrôle d'accès, on peut accéder aux objets envoyés à la méthode (par exemple contact) en utilisant la syntaxe #contact.
Cependant, je ne peux pas obtenir les annotations @PreAuthorize (ou @RolesAllowed) pour travailler sur une action du contrôleur Grails. Si j'annoter la liste action @PreAuthorize (plutôt que @Secured, comme ci-dessus), je reçois l'erreur suivante:
Annotation @org.springframework.security.access.prepost.PreAuthorize is not allowed on element FIELD
Ce n'est pas surprenant - l'action est une fermeture Groovy (un champ avec un code exécutable), plutôt qu'une méthode. Cependant, je l'ai également essayé d'utiliser l'annotation sur les méthodes, appelé à la fermeture, comme:
def list = {
testMethod()
....
}
@PreAuthorize("hasRole('ROLE_USER')")
public boolean testMethod(){
println "testMethod succeess"
return true;
}
Bien que cela ne jette pas d'erreurs, il ne semble pas non plus de fournir un contrôle d'accès. ("testMethod success" est imprimé, que l'utilisateur ait ou non ROLE_USER). J'ai donc essayé quelques choses différentes (et lu la documentation), mais je n'ai pas réussi à trouver une façon agréable d'utiliser les annotations @PreAuthorize avec une action de contrôleur Grails. Est-ce possible? Existe-t-il un meilleur moyen dans une application Grails d'utiliser Spring-Security-Annotations pour fournir un contrôle d'accès en fonction de l'état du système?