Zend_Acl-Refining.xml 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.acl.refining">
  4. <title>Настройка управления доступом</title>
  5. <sect2 id="zend.acl.refining.precise">
  6. <title>Точное управление доступом</title>
  7. <para>
  8. Базовый <acronym>ACL</acronym>, как было описано в
  9. <link linkend="zend.acl.introduction">предыдущем разделе</link>,
  10. демонстрирует, как
  11. различные привилегии могут быть разрешены в <acronym>ACL</acronym> (ко всем ресурсам).
  12. Но на практике средства управления доступом
  13. имеют тенденцию к тому, чтобы иметь исключения из правил и различную
  14. степень сложности. <classname>Zend_Acl</classname> позволяет производить
  15. детализацию просто и гибко.
  16. </para>
  17. <para>
  18. Для <acronym>CMS</acronym> из нашего примера было установлено, что хотя группа
  19. 'сотрудник' подходит большинству пользователей,
  20. возникла необходимость в новой группе 'маркетинг', которая имела бы
  21. доступ к подписке и последним новостям в CMS.
  22. Группа в некоторой степени самодостаточна и будет иметь возможность
  23. публиковать и удалять как подписки, так и последние новости.
  24. </para>
  25. <para>
  26. Кроме этого, необходимо, чтобы группе 'сотрудник' было разрешено
  27. просматривать новости, но запрещено редактировать их. И наконец,
  28. должно быть запрещено всем (в том числе и администраторам)
  29. помещать в архив любые 'объявления', если с момента добавления
  30. прошло только 1-2 дня.
  31. </para>
  32. <para>
  33. В первую очередь мы модифицируем реестр ролей для отражения
  34. этих изменений. Мы определили,
  35. что группа 'маркетинг' имеет те же базовые права, что и 'сотрудник',
  36. поэтому мы определим 'маркетинг' таким образом, чтобы она
  37. наследовала права группы 'сотрудник':
  38. </para>
  39. <programlisting language="php"><![CDATA[
  40. // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
  41. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  42. ]]></programlisting>
  43. <para>
  44. Далее обратите внимание, что указанные выше права доступа имеют
  45. отношение к особым ресурсам (например, "подписка", "последние
  46. новости"). Теперь добавим эти ресурсы:
  47. </para>
  48. <programlisting language="php"><![CDATA[
  49. // Создаем ресурсы для этих ролей
  50. // подписка
  51. $acl->add(new Zend_Acl_Resource('newsletter'));
  52. // новости
  53. $acl->add(new Zend_Acl_Resource('news'));
  54. // последние новости
  55. $acl->add(new Zend_Acl_Resource('latest'), 'news');
  56. // объявления
  57. $acl->add(new Zend_Acl_Resource('announcement'), 'news');
  58. ]]></programlisting>
  59. <para>
  60. Затем определяются более точные правила для целевых областей <acronym>ACL</acronym>.
  61. </para>
  62. <programlisting language="php"><![CDATA[
  63. // Маркетинг должен иметь возможность публиковать и удалять подписку
  64. // и последние новости
  65. $acl->allow('marketing',
  66. array('newsletter', 'latest'),
  67. array('publish', 'archive'));
  68. // Пользователю (и маркетингу через наследование), запрещено редактировать
  69. // последние новости
  70. $acl->deny('staff', 'latest', 'revise');
  71. // Всем, включая администраторов, не разрешается удалять объявления
  72. $acl->deny(null, 'announcement', 'archive');
  73. ]]></programlisting>
  74. <para>
  75. Теперь мы можем производить запросы к <acronym>ACL</acronym> с учетом последних
  76. изменений:
  77. </para>
  78. <programlisting language="php"><![CDATA[
  79. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  80. "разрешен" : "запрещен";
  81. // запрещен
  82. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  83. "разрешен" : "запрещен";
  84. // разрешен
  85. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  86. "разрешен" : "запрещен";
  87. // запрещен
  88. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  89. "разрешен" : "запрещен";
  90. // разрешен
  91. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  92. "разрешен" : "запрещен";
  93. // разрешен
  94. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  95. "разрешен" : "запрещен";
  96. // запрещен
  97. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  98. "разрешен" : "запрещен";
  99. // запрещен
  100. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  101. "разрешен" : "запрещен";
  102. // запрещен
  103. ]]></programlisting>
  104. </sect2>
  105. <sect2 id="zend.acl.refining.removing">
  106. <title>Удаление правил доступа</title>
  107. <para>
  108. Для того, чтобы удалить одно или несколько правил из <acronym>ACL</acronym>,
  109. используйте методы <code>removeAllow()</code>
  110. или <code>removeDeny()</code>. Как и в случае с <code>allow()</code>
  111. и <code>deny()</code>, вы можете передавать
  112. <constant>NULL</constant> в качестве параметра, чтобы применить метод ко
  113. всем ролям, ресурсам, и/или привилегиям:
  114. </para>
  115. <programlisting language="php"><![CDATA[
  116. // Убираем запрет на редактирование последних новостей для 'пользователя'
  117. // (и маркетинга через наследование)
  118. $acl->removeDeny('staff', 'latest', 'revise');
  119. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  120. "разрешен" : "запрещен";
  121. // разрешен
  122. // Убираем разрешение на публикацию и удаление подписки для маркетинга
  123. $acl->removeAllow('marketing',
  124. 'newsletter',
  125. array('publish', 'archive'));
  126. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  127. "разрешен" : "запрещен";
  128. // запрещен
  129. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  130. "разрешен" : "запрещен";
  131. // запрещен
  132. ]]></programlisting>
  133. <para>
  134. Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр <constant>NULL</constant>
  135. для привилегий переопределяет такой порядок изменений:
  136. </para>
  137. <programlisting language="php"><![CDATA[
  138. // Разрешить маркетингу все действия над последними новостями
  139. $acl->allow('marketing', 'latest');
  140. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  141. "разрешен" : "запрещен";
  142. // разрешен
  143. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  144. "разрешен" : "запрещен";
  145. // разрешен
  146. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  147. "разрешен" : "запрещен";
  148. // разрешен
  149. ]]></programlisting>
  150. </sect2>
  151. </sect1>
  152. <!--
  153. vim:se ts=4 sw=4 et:
  154. -->