Zend_Acl-Refining.xml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  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. L'<acronym>ACL</acronym> 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 l'<acronym>ACL</acronym> (toutes les
  12. ressources). En pratique, toutefois, les contrôles d'accès ont souvent des exceptions et
  13. des degrés de complexité variables. <classname>Zend_Acl</classname> permet d'atteindre
  14. ce degré de finesse d'une manière directe et flexible.
  15. </para>
  16. <para>
  17. Pour l'exemple du <acronym>CMS</acronym>, nous avons déterminé que bien que le groupe
  18. "Staff" couvre les besoins de la plupart des utilisateurs, un groupe "Marketing" est
  19. nécessaire. Ce groupe doit avoir accès à la newsletter et aux dernières news dans le
  20. <acronym>CMS</acronym>. Le groupe va recevoir la possibilité de publier et d'archiver à
  21. la fois des newsletters et des 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->addResource(new Zend_Acl_Resource('newsletter'));
  48. // news
  49. $acl->addResource(new Zend_Acl_Resource('news'));
  50. // dernières news
  51. $acl->addResource(new Zend_Acl_Resource('latest'), 'news');
  52. // annonces
  53. $acl->addResource(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'<acronym>ACL</acronym>&#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 <acronym>ACL</acronym> sur base des dernières
  74. modifications&#160;:
  75. </para>
  76. <programlisting language="php"><![CDATA[
  77. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  78. "autorisé" : "refusé"; // refusé
  79. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  80. "autorisé" : "refusé"; // autorisé
  81. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  82. "autorisé" : "refusé"; // refusé
  83. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  84. "autorisé" : "refusé"; // autorisé
  85. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  86. "autorisé" : "refusé"; // autorisé
  87. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  88. "autorisé" : "refusé"; // refusé
  89. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  90. "autorisé" : "refusé"; // refusé
  91. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  92. "autorisé" : "refusé"; // refusé
  93. ]]></programlisting>
  94. </sect2>
  95. <sect2 id="zend.acl.refining.removing">
  96. <title>Retirer les Contrôles d'Accès</title>
  97. <para>
  98. Pour retirer une ou plusieurs règles des <acronym>ACL</acronym>, utilisez simplement la
  99. méthode <methodname>removeAllow()</methodname> ou <methodname>removeDeny()</methodname>.
  100. Comme pour <methodname>allow()</methodname> et <methodname>deny()</methodname>, vous
  101. pouvez utiliser une valeur <constant>NULL</constant> pour indiquer que la méthode
  102. s'applique à tous les rôles, ressources et&#160;/&#160;ou privilèges.
  103. </para>
  104. <programlisting language="php"><![CDATA[
  105. // Retire l'interdiction de relire les dernières news au Staff
  106. // (et au marketing, par héritage)
  107. $acl->removeDeny('staff', 'latest', 'relire');
  108. echo $acl->isAllowed('marketing', 'latest', 'relire') ?
  109. "autorisé" : "refusé"; // autorisé
  110. // Retire l'autorisation de publier
  111. // et archiver les newsletters au Marketing
  112. $acl->removeAllow('marketing',
  113. 'newsletter',
  114. array('publish', 'archive'));
  115. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  116. "autorisé" : "refusé"; // refusé
  117. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  118. "autorisé" : "refusé"; // refusé
  119. ]]></programlisting>
  120. <para>
  121. Les privilèges peuvent être modifiés de manière incrémentielle comme indiqué au
  122. dessus, mais une valeur <constant>NULL</constant> pour les privilèges écrase ces
  123. modifications incrémentielles.
  124. </para>
  125. <programlisting language="php"><![CDATA[
  126. // donne au groupe Marketing toutes les permissions
  127. // sur les dernières nouvelles
  128. $acl->allow('marketing', 'latest');
  129. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  130. "autorisé" : "refusé"; // autorisé
  131. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  132. "autorisé" : "refusé"; // autorisé
  133. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  134. "autorisé" : "refusé"; // autorisé
  135. ]]></programlisting>
  136. </sect2>
  137. </sect1>