Navigation

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (@plv) Dernière mise à jour : 22 March 2007

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

Ajouter un commentaire
merci bien pour ce blog il m'a trop aidée puisque je suis débutante en Zend. j'aimerai bien savoir si possible comment faire un chat avec Zend. merci d'avance.
Remerciment
salut, j'aimerai bien remercier l'administrateur de ce blog à propos ces efforts pour bien expliquer quelques composants et j'aimerai avoir un idée sur d'autre comme Zend_Registry, Zend_Config,Zend_ Front, Zend_ View, Zend_ Controller, Zend_ DB et autre et merci d'avance et voila mon émail : elies.ghayoula@gmail.com