2010-08-18 8 views
5

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?

Répondre

5

Vous devez utiliser ACL plugin pour utiliser ces annotations, mais elles ne fonctionneront pas sur les actions du contrôleur pour les raisons que vous avez indiquées. @Secured fonctionne parce que j'ai créé une copie de l'annotation de Spring Security qui permet de le placer sur des champs ainsi que des méthodes et des classes, et je les cherche et les câble explicitement. Vous devrez utiliser les services annotés que vous appelez de vos contrôleurs.