Zend_Acl-Refining.xml 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <sect1 id="zend.acl.refining">
  2. <title>Настройка управления доступом</title>
  3. <sect2 id="zend.acl.refining.precise">
  4. <title>Точное управление доступом</title>
  5. <para>
  6. Базовый ACL, как было описано в
  7. <link linkend="zend.acl.introduction">предыдущем разделе</link>,
  8. демонстрирует, как
  9. различные привилегии могут быть разрешены в ACL (ко всем ресурсам).
  10. Но на практике средства управления доступом
  11. имеют тенденцию к тому, чтобы иметь исключения из правил и различную
  12. степень сложности. Zend_Acl позволяет производить
  13. детализацию просто и гибко.
  14. </para>
  15. <para>
  16. Для CMS из нашего примера было установлено, что хотя группа
  17. 'сотрудник' подходит большинству пользователей,
  18. возникла необходимость в новой группе 'маркетинг', которая имела бы
  19. доступ к подписке и последним новостям в CMS.
  20. Группа в некоторой степени самодостаточна и будет иметь возможность
  21. публиковать и удалять как подписки, так и последние новости.
  22. </para>
  23. <para>
  24. Кроме этого, необходимо, чтобы группе 'сотрудник' было разрешено
  25. просматривать новости, но запрещено редактировать их. И наконец,
  26. должно быть запрещено всем (в том числе и администраторам)
  27. помещать в архив любые 'объявления', если с момента добавления
  28. прошло только 1-2 дня.
  29. </para>
  30. <para>
  31. В первую очередь мы модифицируем реестр ролей для отражения
  32. этих изменений. Мы определили,
  33. что группа 'маркетинг' имеет те же базовые права, что и 'сотрудник',
  34. поэтому мы определим 'маркетинг' таким образом, чтобы она
  35. наследовала права группы 'сотрудник':
  36. </para>
  37. <programlisting role="php"><![CDATA[
  38. // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
  39. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  40. ]]>
  41. </programlisting>
  42. <para>
  43. Далее обратите внимание, что указанные выше права доступа имеют
  44. отношение к особым ресурсам (например, "подписка", "последние
  45. новости"). Теперь добавим эти ресурсы:
  46. </para>
  47. <programlisting role="php"><![CDATA[
  48. // Создаем ресурсы для этих ролей
  49. // подписка
  50. $acl->add(new Zend_Acl_Resource('newsletter'));
  51. // новости
  52. $acl->add(new Zend_Acl_Resource('news'));
  53. // последние новости
  54. $acl->add(new Zend_Acl_Resource('latest'), 'news');
  55. // объявления
  56. $acl->add(new Zend_Acl_Resource('announcement'), 'news');
  57. ]]>
  58. </programlisting>
  59. <para>
  60. Затем определяются более точные правила для целевых областей ACL.
  61. </para>
  62. <programlisting role="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. ]]>
  74. </programlisting>
  75. <para>
  76. Теперь мы можем производить запросы к ACL с учетом последних
  77. изменений:
  78. </para>
  79. <programlisting role="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. ]]>
  105. </programlisting>
  106. </sect2>
  107. <sect2 id="zend.acl.refining.removing">
  108. <title>Удаление правил доступа</title>
  109. <para>
  110. Для того, чтобы удалить одно или несколько правил из ACL,
  111. используйте методы <code>removeAllow()</code>
  112. или <code>removeDeny()</code>. Как и в случае с <code>allow()</code>
  113. и <code>deny()</code>, вы можете передавать
  114. <code>null</code> в качестве параметра, чтобы применить метод ко
  115. всем ролям, ресурсам, и/или привилегиям:
  116. </para>
  117. <programlisting role="php"><![CDATA[
  118. // Убираем запрет на редактирование последних новостей для 'пользователя'
  119. // (и маркетинга через наследование)
  120. $acl->removeDeny('staff', 'latest', 'revise');
  121. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  122. "разрешен" : "запрещен";
  123. // разрешен
  124. // Убираем разрешение на публикацию и удаление подписки для маркетинга
  125. $acl->removeAllow('marketing',
  126. 'newsletter',
  127. array('publish', 'archive'));
  128. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  129. "разрешен" : "запрещен";
  130. // запрещен
  131. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  132. "разрешен" : "запрещен";
  133. // запрещен
  134. ]]>
  135. </programlisting>
  136. <para>
  137. Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр <code>null</code>
  138. для привилегий переопределяет такой порядок изменений:
  139. </para>
  140. <programlisting role="php"><![CDATA[
  141. // Разрешить маркетингу все действия над последними новостями
  142. $acl->allow('marketing', 'latest');
  143. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  144. "разрешен" : "запрещен";
  145. // разрешен
  146. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  147. "разрешен" : "запрещен";
  148. // разрешен
  149. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  150. "разрешен" : "запрещен";
  151. // разрешен
  152. ]]>
  153. </programlisting>
  154. </sect2>
  155. </sect1>
  156. <!--
  157. vim:se ts=4 sw=4 et:
  158. -->