1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.acl.advanced">
5 <title>Расширенное использование</title>
7 <sect2 id="zend.acl.advanced.storing">
9 <title>Постоянное хранение данных ACL</title>
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 контроля доступа приложением.
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 в файле, базе данных или с помощью механизма кэширования.
34 <sect2 id="zend.acl.advanced.assertions">
36 <title>Написание условных правил ACL с утверждениями</title>
39 Иногда правило разрешения или запрета доступа роли к ресурсу должно
40 быть не безусловным, а зависеть от различных критериев. Например,
41 определенный доступ должен быть разрешен, но только с 8:00 до 17:00.
42 Другой пример - доступ должен быть запрещен, если запрос поступил
43 с IP-адреса, находящегося в "черном списке". <classname>Zend_Acl</classname> имеет
44 встроеную поддержку для применения правил, основанных на любых
45 нужных разработчику условиях.
49 <classname>Zend_Acl</classname> предоставляет поддержку условных правил с помощью
50 интерфейса <classname>Zend_Acl_Assert_Interface</classname>.
51 Чтобы использовать интерфейс утверждений, разработчик должен
52 написать класс, который реализует метод <code>assert()</code>
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,
64 return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
67 protected function _isCleanIP($ip)
75 После объявления класса утверждения разработчик должен передавать
76 экземпляр этого класса при определении условных правил. Правило,
77 которое создается с утверждением, применяется
78 только тогда, когда метод утверждения возвращает true.
81 <programlisting language="php"><![CDATA[
82 $acl = new Zend_Acl();
83 $acl->allow(null, null, null, new CleanIPAssertion());
87 Код выше создает условное правило, разрешающее
88 всем доступ ко всем привилегиям всех ресурсов, за исключением
89 случаев, когда IP-адрес запрашивающего занесен в "черный список".
90 Если запрос приходит с IP-адреса, который не определяется как
91 "белый", то правило не применяется.
92 Поскольку правило применяется ко всем ролям, всем ресурсам и всем
93 привилегиям, то "черный" IP приведет к запрещению доступа.
94 Тем не менее, это особый случай, и следует понимать, что во всех
95 других случаях (например, когда для правила были указаны роль,
96 ресурс, или привилегия), невыполнение утверждения приводит к тому,
97 что правило не применяется, и для определения того, реазрешить ли
98 доступ или запретить, могут использоваться другие правила.
102 Методу <code>assert()</code> объекта утверждения передаются ACL,
103 роль, ресурс и привилегия, к которым применяется запрос на
104 авторизацию (например, <code>isAllowed()</code>). Это нужно для
105 предоставления контекста классу утверждения и определения его
106 условий там, где это нужно.