Zend_Acl-Advanced.xml 7.1 KB

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