Zend_Acl-Advanced.xml 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <sect1 id="zend.acl.advanced">
  2. <title>Продвинутое использование</title>
  3. <sect2 id="zend.acl.advanced.storing">
  4. <title>Постоянное хранение данных ACL</title>
  5. <para>
  6. Zend_Acl спроектирован таким образом, что не требует для хранения
  7. данных ACL использования строго определенных технологий хранения -
  8. таких, как база данных или сервер кеша. Его реализация на чистом PHP
  9. позволяет создавать административные инструменты под управлением
  10. Zend_Acl с относительной простотой и гибкостью.
  11. Многие ситуации требуют некоторой интерактивной поддержки от ACL, и
  12. Zend_Acl предоставляет методы для настройки, произведения запросов,
  13. контроля доступа приложением.
  14. </para>
  15. <para>
  16. Тем не менее, хранение данных ACL остается задачей разработчика,
  17. т.к. случаи использования могут сильно варьироваться в различных
  18. ситуациях. Поскольку Zend_Acl доступен для сериализации, то можно
  19. сериализовать объекты ACL через PHP-функцию
  20. <ulink url="http://php.net/serialize"><code>serialize()</code></ulink>,
  21. и результаты можно хранить там, где пожелает разработчик - например,
  22. в файле, базе данных или с помощью механизма кэширования.
  23. </para>
  24. </sect2>
  25. <sect2 id="zend.acl.advanced.assertions">
  26. <title>Написание условных правил ACL с утверждениями</title>
  27. <para>
  28. Иногда правило разрешения или запрета доступа роли к ресурсу должно
  29. быть не безусловным, а зависеть от различных критериев. Например,
  30. определенный доступ должен быть разрешен, но только с 8:00 до 17:00.
  31. Другой пример - доступ должен быть запрещен, если запрос поступил
  32. с IP-адреса, находящегося в "черном списке". Zend_Acl имеет
  33. встроеную поддержку для применения правил, основанных на любых
  34. нужных разработчику условиях.
  35. </para>
  36. <para>
  37. Zend_Acl предоставляет поддержку условных правил с помощью
  38. интерфейса <code>Zend_Acl_Assert_Interface</code>.
  39. Чтобы использовать интерфейс утверждений, разработчик должен
  40. написать класс, который реализует метод <code>assert()</code>
  41. интерфейса:
  42. </para>
  43. <programlisting role="php"><![CDATA[
  44. class CleanIPAssertion implements Zend_Acl_Assert_Interface
  45. {
  46. public function assert(Zend_Acl $acl,
  47. Zend_Acl_Role_Interface $role = null,
  48. Zend_Acl_Resource_Interface $resource = null,
  49. $privilege = null)
  50. {
  51. return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
  52. }
  53. protected function _isCleanIP($ip)
  54. {
  55. // ...
  56. }
  57. }
  58. ]]>
  59. </programlisting>
  60. <para>
  61. После объявления класса утверждения разработчик должен передавать
  62. экземпляр этого класса при определении условных правил. Правило,
  63. которое создается с утверждением, применяется
  64. только тогда, когда метод утверждения возвращает true.
  65. </para>
  66. <programlisting role="php"><![CDATA[
  67. $acl = new Zend_Acl();
  68. $acl->allow(null, null, null, new CleanIPAssertion());
  69. ]]>
  70. </programlisting>
  71. <para>
  72. Код выше создает условное правило, разрешающее
  73. всем доступ ко всем привилегиям всех ресурсов, за исключением
  74. случаев, когда IP-адрес запрашивающего занесен в "черный список".
  75. Если запрос приходит с IP-адреса, который не определяется как
  76. "белый", то правило не применяется.
  77. Поскольку правило применяется ко всем ролям, всем ресурсам и всем
  78. привилегиям, то "черный" IP приведет к запрещению доступа.
  79. Тем не менее, это особый случай, и следует понимать, что во всех
  80. других случаях (например, когда для правила были указаны роль,
  81. ресурс, или привилегия), невыполнение утверждения приводит к тому,
  82. что правило не применяется, и для определения того, реазрешить ли
  83. доступ или запретить, могут использоваться другие правила.
  84. </para>
  85. <para>
  86. Методу <code>assert()</code> объекта утверждения передаются ACL,
  87. роль, ресурс и привилегия, к которым применяется запрос на
  88. авторизацию (например, <code>isAllowed()</code>). Это нужно для
  89. предоставления контекста классу утверждения и определения его
  90. условий там, где это нужно.
  91. </para>
  92. </sect2>
  93. </sect1>
  94. <!--
  95. vim:se ts=4 sw=4 et:
  96. -->