Affiner les Contrôles d'AccèsMieux définir les Contrôles d'Accès
La liste basique définie dans le
chapitre précédentmontre comment plusieurs
privilèges peuvent être alloués pour l'ensemble de la liste (toutes les ressources). En
pratique, toutefois, les contrôles d'accès ont souvent des exceptions et des degrés de
complexité variables. Zend_Acl permet d'atteindre ce degré de
finesse d'une manière directe et flexible.
Pour l'exemple du CMS, nous avons déterminé que bien que le groupe "Staff" couvre
les besoins de la plupart des utilisateurs, un groupe "Marketing" est nécessaire. Ce
groupe doit avoir accès à la newsletter et aux dernières news dans le CMS. Le groupe va
recevoir la possibilité de publier et d'archiver à la fois des newsletters et des
news.
De plus, il a été demandé que le groupe "Staff" puisse voir les nouveaux textes,
mais pas les nouvelles news. Enfin, il devrait être impossible pour tout le monde (y
compris les administrateurs) d'archiver un contenu qui n'aurait une durée de vie que de
1 ou 2 jours.
En premier lieu, nous modifions le registre des rôles pour refléter ces
changements. Nous avons dit que le groupe "Marketing" a les même permissions de base
que "Staff". Donc nous créons "marketing" pour qu'il hérite des permissions de
"staff".
addRole(new Zend_Acl_Role('marketing'), 'staff');
]]>
Ensuite, notez que les contrôles d'accès plus haut font référence à des
ressources (ex. "newsletters", "dernières news", "annonces"). Maintenant, nous ajoutons
ces Ressources :
add(new Zend_Acl_Resource('newsletter'));
// news
$acl->add(new Zend_Acl_Resource('news'));
// dernières news
$acl->add(new Zend_Acl_Resource('latest'), 'news');
// annonces
$acl->add(new Zend_Acl_Resource('announcement'), 'news');
]]>
Ensuite c'est simplement une manière de définir ces règles spécifiques sur les
parties cibles de l'ACL :
allow('marketing',
array('newsletter', 'latest'),
array('publish', 'archive'));
// Staff (et marketing, par héritage),
// n'ont pas la permission de relire les dernières news
$acl->deny('staff', 'latest', 'relire');
// Personne (y compris les administrateurs)
// n'a la permission d'archiver des annonces
$acl->deny(null, 'annonce', 'archive');
]]>
On peut maintenant interroger les ACL sur base des dernières modifications :
isAllowed('staff', 'newsletter', 'publish') ?
"autorisé" : "refusé"; // refusé
echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
"autorisé" : "refusé"; // autorisé
echo $acl->isAllowed('staff', 'latest', 'publish') ?
"autorisé" : "refusé"; // refusé
echo $acl->isAllowed('marketing', 'latest', 'publish') ?
"autorisé" : "refusé"; // autorisé
echo $acl->isAllowed('marketing', 'latest', 'archive') ?
"autorisé" : "refusé"; // autorisé
echo $acl->isAllowed('marketing', 'latest', 'revise') ?
"autorisé" : "refusé"; // refusé
echo $acl->isAllowed('editor', 'announcement', 'archive') ?
"autorisé" : "refusé"; // refusé
echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
"autorisé" : "refusé"; // refusé
]]>Retirer les Contrôles d'Accès
Pour retirer une ou plusieurs règles des ACL, utilisez simplement la méthode
removeAllow() ou removeDeny(). Comme pour
allow() et deny(), vous pouvez utiliser une valeur
null pour indiquer que la méthode s'applique à tous les rôles, ressources
et/ou privilèges.
removeDeny('staff', 'latest', 'relire');
echo $acl->isAllowed('marketing', 'latest', 'relire') ?
"autorisé" : "refusé"; // autorisé
// Retire l'autorisation de publier
// et archiver les newsletters au Marketing
$acl->removeAllow('marketing',
'newsletter',
array('publish', 'archive'));
echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
"autorisé" : "refusé"; // refusé
echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
"autorisé" : "refusé"; // refusé
]]>
Les privilèges peuvent être modifiés de manière incrémentielle comme indiqué au
dessus, mais une valeur null pour les privilèges écrase ces modifications
incrémentielles.
allow('marketing', 'latest');
echo $acl->isAllowed('marketing', 'latest', 'publish') ?
"autorisé" : "refusé"; // autorisé
echo $acl->isAllowed('marketing', 'latest', 'archive') ?
"autorisé" : "refusé"; // autorisé
echo $acl->isAllowed('marketing', 'latest', 'anything') ?
"autorisé" : "refusé"; // autorisé
]]>