Zend_Acl-Refining.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 15101 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.refining">
  5. <title>Affiner les Contrôles d'Accès</title>
  6. <sect2 id="zend.acl.refining.precise">
  7. <title>Mieux définir les Contrôles d'Accès</title>
  8. <para>
  9. La liste basique définie dans le
  10. <link linkend="zend.acl.introduction">chapitre précédent</link>montre comment plusieurs
  11. privilèges peuvent être alloués pour l'ensemble de la liste (toutes les ressources). En
  12. pratique, toutefois, les contrôles d'accès ont souvent des exceptions et des degrés de
  13. complexité variables. <classname>Zend_Acl</classname> permet d'atteindre ce degré de
  14. finesse d'une manière directe et flexible.
  15. </para>
  16. <para>
  17. Pour l'exemple du CMS, nous avons déterminé que bien que le groupe "Staff" couvre
  18. les besoins de la plupart des utilisateurs, un groupe "Marketing" est nécessaire. Ce
  19. groupe doit avoir accès à la newsletter et aux dernières news dans le CMS. Le groupe va
  20. recevoir la possibilité de publier et d'archiver à la fois des newsletters et des
  21. news.
  22. </para>
  23. <para>
  24. De plus, il a été demandé que le groupe "Staff" puisse voir les nouveaux textes,
  25. mais pas les nouvelles news. Enfin, il devrait être impossible pour tout le monde (y
  26. compris les administrateurs) d'archiver un contenu qui n'aurait une durée de vie que de
  27. 1 ou 2 jours.
  28. </para>
  29. <para>
  30. En premier lieu, nous modifions le registre des rôles pour refléter ces
  31. changements. Nous avons dit que le groupe "Marketing" a les même permissions de base
  32. que "Staff". Donc nous créons "marketing" pour qu'il hérite des permissions de
  33. "staff".
  34. </para>
  35. <programlisting language="php"><![CDATA[
  36. // Le nouveau groupe Marketing hérite des permissions de Staff
  37. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  38. ]]></programlisting>
  39. <para>
  40. Ensuite, notez que les contrôles d'accès plus haut font référence à des
  41. ressources (ex. "newsletters", "dernières news", "annonces"). Maintenant, nous ajoutons
  42. ces Ressources&#160;:
  43. </para>
  44. <programlisting language="php"><![CDATA[
  45. // Créer les Ressources pour les règles
  46. // newsletter
  47. $acl->add(new Zend_Acl_Resource('newsletter'));
  48. // news
  49. $acl->add(new Zend_Acl_Resource('news'));
  50. // dernières news
  51. $acl->add(new Zend_Acl_Resource('latest'), 'news');
  52. // annonces
  53. $acl->add(new Zend_Acl_Resource('announcement'), 'news');
  54. ]]></programlisting>
  55. <para>
  56. Ensuite c'est simplement une manière de définir ces règles spécifiques sur les
  57. parties cibles de l'ACL&#160;:
  58. </para>
  59. <programlisting language="php"><![CDATA[
  60. // Le Marketing doit être capable de publier
  61. // et d'archiver les newsletters et les dernières news
  62. $acl->allow('marketing',
  63. array('newsletter', 'latest'),
  64. array('publish', 'archive'));
  65. // Staff (et marketing, par héritage),
  66. // n'ont pas la permission de relire les dernières news
  67. $acl->deny('staff', 'latest', 'relire');
  68. // Personne (y compris les administrateurs)
  69. // n'a la permission d'archiver des annonces
  70. $acl->deny(null, 'annonce', 'archive');
  71. ]]></programlisting>
  72. <para>
  73. On peut maintenant interroger les ACL sur base des dernières modifications&#160;:
  74. </para>
  75. <programlisting language="php"><![CDATA[
  76. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  77. "autorisé" : "refusé"; // refusé
  78. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  79. "autorisé" : "refusé"; // autorisé
  80. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  81. "autorisé" : "refusé"; // refusé
  82. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  83. "autorisé" : "refusé"; // autorisé
  84. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  85. "autorisé" : "refusé"; // autorisé
  86. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  87. "autorisé" : "refusé"; // refusé
  88. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  89. "autorisé" : "refusé"; // refusé
  90. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  91. "autorisé" : "refusé"; // refusé
  92. ]]></programlisting>
  93. </sect2>
  94. <sect2 id="zend.acl.refining.removing">
  95. <title>Retirer les Contrôles d'Accès</title>
  96. <para>
  97. Pour retirer une ou plusieurs règles des ACL, utilisez simplement la méthode
  98. <code>removeAllow()</code> ou <code>removeDeny()</code>. Comme pour
  99. <code>allow()</code> et <code>deny()</code>, vous pouvez utiliser une valeur
  100. <code>null</code> pour indiquer que la méthode s'applique à tous les rôles, ressources
  101. et/ou privilèges.
  102. </para>
  103. <programlisting language="php"><![CDATA[
  104. // Retire l'interdiction de relire les dernières news au Staff
  105. // (et au marketing, par héritage)
  106. $acl->removeDeny('staff', 'latest', 'relire');
  107. echo $acl->isAllowed('marketing', 'latest', 'relire') ?
  108. "autorisé" : "refusé"; // autorisé
  109. // Retire l'autorisation de publier
  110. // et archiver les newsletters au Marketing
  111. $acl->removeAllow('marketing',
  112. 'newsletter',
  113. array('publish', 'archive'));
  114. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  115. "autorisé" : "refusé"; // refusé
  116. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  117. "autorisé" : "refusé"; // refusé
  118. ]]></programlisting>
  119. <para>
  120. Les privilèges peuvent être modifiés de manière incrémentielle comme indiqué au
  121. dessus, mais une valeur <code>null</code> pour les privilèges écrase ces modifications
  122. incrémentielles.
  123. </para>
  124. <programlisting language="php"><![CDATA[
  125. // donne au groupe Marketing toutes les permissions
  126. // sur les dernières nouvelles
  127. $acl->allow('marketing', 'latest');
  128. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  129. "autorisé" : "refusé"; // autorisé
  130. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  131. "autorisé" : "refusé"; // autorisé
  132. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  133. "autorisé" : "refusé"; // autorisé
  134. ]]></programlisting>
  135. </sect2>
  136. </sect1>