2010-01-23 7 views
2

Dans notre nouveau projet de logiciel, nous avons l'exigence suivante: Une page Web doit montrer un ensemble de données. Ces données doivent être modifiables par certains utilisateurs (assignés aux rôles, c'est-à-dire par le gestionnaire), et uniquement visibles par les autres. La partie délicate est décrite par un exemple:
Une page utilisateur se compose de données d'adresse et d'informations de compte. Les données d'addition doivent être modifiables par l'utilisateur et le gestionnaire et être visualisées par tous les utilisateurs, tandis que les informations de compte ne doivent être visibles que par l'utilisateur réel et le gestionnaire.ACL au niveau du champ dans Grails

J'ai lu beaucoup d'informations sur SpringSecurity. Il fournit un très bon cadre pour les grandes permissions sur les urls et les méthodes et même les classes de domaine. Mais ce dont j'ai besoin, ce sont des ACL au niveau du champ. Au moins, c'est ce que je pense en ce moment. Donc, la question est: Comment résoudre ce problème en utilisant Grails?

Merci beaucoup à l'avance,

Cordialement Daniel

Répondre

0

Spring Security (Acegi Plugin) est certainement la voie à suivre avec Grails.

Il y a un taglib vous pouvez utiliser qui permettra une page différente pour les différents rôles tels que les suivants:

<g:ifUserHasRole roles="ROLE_ADMIN"> 
html code for extra fields 
</g:ifUserHasRole> 
+0

Merci pour cette réponse rapide incroyable. Cette balise semble très utile car des vues limitées et une fonctionnalité d'édition appropriée peuvent être implémentées en l'utilisant. Le seul inconvénient qui me vient à l'esprit est: Les rôles sont codés en dur dans les fichiers GSP, n'est-ce pas? Avez-vous une idée astucieuse de ce problème? – Daniel

+0

Dans Bootstrap.groovy, vous avez généralement du code pour définir les rôles et .save() mais GORM (avec sql) crée en fait des tables de base de données telles que role. –

+0

Merci encore pour votre réponse. Une question concernant la sécurité: Si la visualisation ou l'édition d'une propriété est désactivée, cela ne signifie pas que le contrôleur "connaît" le fait et ignore certaines données qui sont envoyées dans la requête. Alors quelle est la meilleure pratique pour empêcher une telle "attaque". De plus, il me semble que je dois coder en dur le mapping du rôle sur une propriété à deux endroits: GSP et le contrôleur. Y a-t-il un endroit central pour le dire? – Daniel

0

Moi, j'encode sur la classe de domaine, émulant la façon GORM Avez-vous annoter les classes de domaine (static access = [field1: "ROLE_USER", field2: "ROLE_ADMIN,ROLE_USER"] à titre d'exemple). Ensuite, construisez une méthode que votre contrôleur pourrait utiliser pour les supprimer pour un utilisateur donné. Cette méthode peut utiliser les annotations de la classe de domaine pour décider comment la supprimer. Ensuite, métaprogrammez-le sur chacune des classes de domaine comme le font les plugins. De même, écrivez la méthode inverse pour restreindre les liaisons de données des paramètres dans la classe de domaine, écrivez votre propre méthode d'utilitaire de liaison de données, puis métaprogrammez-la sur chaque classe de domaine.

Ensuite, vous pouvez simplement utiliser instance.redact(user) ou instance.bindData(params, user) pour faire ce que vous voulez, et c'est pratiquement une syntaxe déclarative.

0

Nous avons une situation similaire et utilisons à la fois la balise ifUserHasRole dans le fichier gsp pour piloter la présentation appropriée et nous avons un filtre qui applique les règles en fonction de l'action appelée. Par exemple, sur le contrôleur d'utilisateur, nous autoriserions uniquement les actions de gestion à appeler l'action de sauvegarde, ou si user.id est identique à session.user.id. Cela semblait être la meilleure option pour notre situation.

0

Qu'en est-il la création d'une classe d'ACL comme ceci:

class ACL(val entry: Entry*) { 
    def isAccessAllowed(subject: String, permission: String): Boolean = ... 
} 

class Entry(val subject: String, val permission: String*) 

utilisation:

new ACL(
    new Entry("dave", "read", "write"), 
    new Entry("linda", "read") 
) 

(Cet exemple est à Scala, parce que je l'ai trouvé plus expressif dans ce cas, mais il devrait être facile à transférer à Groovy.)

Vous devez ensuite connecter un objet ACL avec l'objet à protéger.

Questions connexes