Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
Initiation à Zend_Acl
Introduction
Zend_Acl est utilisé pour dire si un objet a le droit de faire une action ou non. Avec Zend_Acl, on va pouvoir dire : "tel internaute a le droit de lire le forum A mais pas d'écrire dedans, alors que dans le forum B il aura le droit de lire et d'écrire des messages".
Note : il ne faut pas confondre Zend_Acl et Zend_Auth :
- Zend_Auth permet de dire que celui qui surfe sur le site est bien monsieur Durand
- Zend_Acl permet de dire que monsieur Durand a le droit d'ajouter un message dans le blog du site, mais n'a pas le droit d'effacer un message
Un exemple concrêt
Voilà la situation :
- Durand est chef
- Martin et Lefevre sont employés
Dans cette entreprise, les chefs peuvent écrire dans le blog de la boîte, mais les employés ne peuvent que lire le blog.
Vocabulaire et concepts
Nous avons 3 concepts à bien comprendre :
- Role : Durand, Martin et Lefevre sont des rôles. Le groupe "employes" et le groupe "chefs" sont également des rôles. Ce sont les objets qui veulent accéder à une ressource.
- Resource : Dans notre exemple, le blog est l'unique ressource.
- Moteur d'ACL : c'est une instance de Zend_Acl
- On l'initialise avec les informations suivantes :
- l'ensemble des rôles
- l'ensemble des ressources
- toutes les règles du genre "Les chefs ont le droit d'écrire dans le blog"
- Une fois initialisé, on l'interroge pour lui demander si tel role a le droit de faire telle action sur telle ressource (par exemple si Durand a le droit d'écrire dans un blog)
Ensuite l'utilisation de Zend_Acl suit deux étapes :
- Initialiser le moteur d'ACL
- Utiliser le moteur d'ACL
Notons qu'on peut définir une hiérarchie entre les rôles : si Martin est défini comme employé, il héritera des droits de employés (s'il n'a pas de droit propre pour la même requête)
Exemple de code
Le code se divise en 2 parties :
- La première partie initialise le moteur d'ACL
- Création des roles
- Création des ressources
- Ajout des rôles au moteur d'ACL
- Notons que c'est ici que l'on définit une hiérarchie entre les roles
- ainsi on indique que martin hérite des droits de "employés"
- Ajout des ressources au moteur d'ACL (ici, le blog)
- Création des droits
- La deuxième partie interroge le moteur d'ACL
Jouez avec la création des droits, ajoutez par exemple :
$acl->allow("martin","blog","write");
et voyez comment les résultats sont modifiés
<?php /* * Created on 22 mars 07 * * @author Philippe Le Van (http://www.kitpages.fr) * @copyright 2005-2007 */ set_include_path( "C:/ZendFramework-0.9.0-Beta/library;". get_include_path() ); require_once 'Zend/Loader.php'; Zend_Loader::loadClass("Zend_Acl"); Zend_Loader::loadClass("Zend_Acl_Role"); Zend_Loader::loadClass("Zend_Acl_Resource"); //// // Definition des roles, ressources et des droits d'acces //// // creer le moteur d'ACL $acl = new Zend_Acl(); // creation de roles "groupes" $roleChefs = new Zend_Acl_Role("chefs"); $roleEmployes = new Zend_Acl_Role("employes"); // creation de roles "individus" $roleDurand = new Zend_Acl_Role("durand"); $roleMartin = new Zend_Acl_Role("martin"); $roleLefevre = new Zend_Acl_Role("lefevre"); // creer des ressources $resourceBlog = new Zend_Acl_Resource("blog"); // creer la hierarchie de roles $acl->addRole($roleChefs); $acl->addRole($roleEmployes); $acl->addRole($roleDurand,array("employes","chefs")); $acl->addRole($roleMartin,"employes"); $acl->addRole($roleLefevre,"employes"); // ajouter les ressources au moteur $acl->add($resourceBlog); // indiquer qui a le droit de faire quoi $acl->allow("employes","blog","read"); $acl->allow("chefs","blog",array("read","write")); //// // fonction d'interrogation //// echo $acl->isAllowed('martin','blog','read')? "martin peut lire le blog": "martin ne peut pas lire le blog"; echo "<br/>"; echo $acl->isAllowed('martin','blog','write')? "martin peut écrire dans le blog": "martin ne peut pas écrire dans le blog"; echo "<br/>"; echo $acl->isAllowed('lefevre','blog','read')? "lefevre peut lire le blog": "lefevre ne peut pas lire le blog"; echo "<br/>"; echo $acl->isAllowed('lefevre','blog','write')? "lefevre peut écrire dans le blog": "lefevre ne peut pas écrire dans le blog"; echo "<br/>"; echo $acl->isAllowed('durand','blog','read')? "durand peut lire le blog": "durand ne peut pas lire le blog"; echo "<br/>"; echo $acl->isAllowed('durand','blog','write')? "durand peut écrire dans le blog": "durand ne peut pas écrire dans le blog"; echo "<br/>"; ?>
Conclusion
J'espère avoir été assez clair. Par contre je souhaitais rester concis, c'est un peu raté...
Si vous avez des remarques ou des corrections, n'hésitez pas à m'en faire part dans les commentaires.
La doc officielle (en) : http://framework.zend.com/manual/en/zend.acl.html
Commentaires
Note : on ne peut plus ajouter de commentaire sur ce site