Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je suis en train de mettre en place Zend_Acl pour un site communautaire assez complexe. J'ai des soucis d'organisation.
Je définis les droits au niveaux de certains profils dans certains groupes :
* dans le groupe 12, le profil "admin" a le droit de tout faire, le profil "user" a le droit de lire...
* ensuite si l'utilisateur courant a le profil "user" dans le groupe 12, je le fais hériter de user qui lui même hérite de groupe 12
Dans la pratique, j'ai les rôles suivants :
$acl->addRole(new Zend_Acl_Role("groupe12"));
$acl->addRole(new Zend_Acl_Role("groupe12_user"));
$acl->addRole(new Zend_Acl_Role("currentUser","groupe12_user"));
Ensuite pour interroger le moteur d'ACL, je fais par exemple : $acl->isAllowed("currentUser","groupe12","forum/addMessage");
Et là j'ai des problèmes existentiels :
* mon rôle "groupe12_user", je suis obligé de lui donner un préfixe avec le nom du groupe pour qu'il soit unique
* si l'internaute visite un autre groupe et que je veux charger ses droits liés au nouveau groupe à la volée, je ne peux pas ajouter un nouveau parent au rôle "currentUser" (aucune fonction dispo dans Zend_Acl).
Est-ce que vous pensez que cette organisation est pertinente ?
Est-ce que quelqu'un a mis en place une organisation qui tient la route ?
Philippe
Hors ligne
* mon rôle "groupe12_user", je suis obligé de lui donner un préfixe avec le nom du groupe pour qu'il soit unique
Je ne pense pas que cela soit un problème, mais il est clair qu'il faut être rigoureux. Il serait intéressant que Zend_Acl fournisse une solution pour prendre en compte des namespaces (comme pour Zend_Session).
* si l'internaute visite un autre groupe et que je veux charger ses droits liés au nouveau groupe à la volée, je ne peux pas ajouter un nouveau parent au rôle "currentUser" (aucune fonction dispo dans Zend_Acl).
Spontanément, j'aurais tendance à dire que le rôle "currentUser" doit être manipulé de manière dynamique, c'est à dire ajouté et enlevé au grès des visites avec Zend_Acl::hasRole(), Zend_Acl::removeRole() et Zend_Acl::addRole().
Hors ligne
Spontanément, j'aurais tendance à dire que le rôle "currentUser" doit être manipulé de manière dynamique, c'est à dire ajouté et enlevé au grès des visites avec Zend_Acl::hasRole(), Zend_Acl::removeRole() et Zend_Acl::addRole().
J'en suis arrivé à la création d'une fonction addParentRole qui fait le removeRole qui va bien et le addRole associé.
Je te remercie pour ta réponse. Au moins tu ne trouves pas mon approche complètement abérante :-) . Je suis assez confiant sur le fait d'arriver à un truc qui marchote, mais j'ai peur de prendre le problème à l'envers...
Je vais continuer dans cette voie. Si tu penses à une organisation meilleure, n'hésite pas à poster un nouveau message :-)
A+, Philippe
Hors ligne
AMHA, je dirais que tu devrais supprimer cette notion de groupe ds les ACL (du moins jusqu'a l'apparition des namespaces) et te contenter des roles des users (root, admin, user, guest) , ensuite pour voir si le user a le droit de visiter ce group tu crees un assert, bref voila a quoi sa ressemble :
$acl->add(new Zend_Acl_Resource('forum')); $acl->addRole(new Zend_Acl_Role('guest')) addRole(new Zend_Acl_Role('user')) addRole(new Zend_Acl_Role('admin'), 'user') addRole(new Zend_Acl_Role('root'), 'admin'); $acl->deny('guest'); $acl->allow('user', 'forum', 'readMessage', new leGroupeEstBon()) allow('admin', 'forum') allow('root');
je n'ai pas teste le code mais normalement ca devrait fonctionner
Hors ligne
En fait ça ne marche pas dans mon cas, parce que le même gars a un profil différent dans chaque groupe
Hors ligne
J'ai sensiblement le même problème : mon application sera composée de plusieurs modules, avec quelques centaines d'utilisateurs chacun. Certains pourront avoir accès à plusieurs modules, sachant qu'il y aura 3 privilèges possibles par module (a priori...) : admin (gestion des droits des autres users, notamment :S), lecteur et contributeur (écriture)
Je vous tiendrais au courant de ma solution, enfin quand je l'aurais trouvé
Hors ligne
J'ai fait une feature request pour l'ajout d'un rôle parent : ZF-1175. Elle a été acceptée a priori, mais je sais pas trop quand ça va sortir...
A+, Philippe
Hors ligne
J'arrive un peu tard... mais vieux motard...
La solution pour gérer les ACL n'est-elle pas de coupler zen_acl et zen_auth, ce dernier créant un objet droits adapté à l'identifiant connecté ?
Je veux dire :
zen_auth (sous-classe héritée, évidemment) > vérifie l'identification et le profil d'accès puis crée un objet compatible avec ce qu'attend zen_acl puis zen_acl vérifie les droits en fonction !
Je vais tenter cela sur un projet en cours pour lequel les id doivent avoir les droits sur des dossiers de téléchargement (c'est une BDDI). Je vous en dis plus dès que.
A+
David
Hors ligne