Zend_Acl-Refining.xml 8.8 KB

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