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