| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.acl.advanced">
- <title>Расширенное использование</title>
- <sect2 id="zend.acl.advanced.storing">
- <title>Постоянное хранение данных ACL</title>
- <para>
- <classname>Zend_Acl</classname> спроектирован таким образом, что не требует для хранения
- данных <acronym>ACL</acronym> использования строго определенных технологий хранения -
- таких, как база данных или сервер кеша. Его реализация на чистом <acronym>PHP</acronym>
- позволяет создавать административные инструменты под управлением
- <classname>Zend_Acl</classname> с относительной простотой и гибкостью.
- Многие ситуации требуют некоторой интерактивной поддержки от <acronym>ACL</acronym>, и
- <classname>Zend_Acl</classname> предоставляет методы для настройки, произведения
- запросов, контроля доступа приложением.
- </para>
- <para>
- Тем не менее, хранение данных <acronym>ACL</acronym> остается задачей разработчика,
- т.к. случаи использования могут сильно варьироваться в различных
- ситуациях. Поскольку <classname>Zend_Acl</classname> доступен для сериализации, то можно
- сериализовать объекты <acronym>ACL</acronym> через <acronym>PHP</acronym>-функцию
- <ulink url="http://php.net/serialize"><methodname>serialize()</methodname></ulink>,
- и результаты можно хранить там, где пожелает разработчик - например,
- в файле, базе данных или с помощью механизма кэширования.
- </para>
- </sect2>
- <sect2 id="zend.acl.advanced.assertions">
- <title>Написание условных правил ACL с утверждениями</title>
- <para>
- Иногда правило разрешения или запрета доступа роли к ресурсу должно
- быть не безусловным, а зависеть от различных критериев. Например,
- определенный доступ должен быть разрешен, но только с 8:00 до 17:00.
- Другой пример - доступ должен быть запрещен, если запрос поступил
- с IP-адреса, находящегося в "черном списке". <classname>Zend_Acl</classname> имеет
- встроеную поддержку для применения правил, основанных на любых
- нужных разработчику условиях.
- </para>
- <para>
- <classname>Zend_Acl</classname> предоставляет поддержку условных правил с помощью
- интерфейса <classname>Zend_Acl_Assert_Interface</classname>.
- Чтобы использовать интерфейс утверждений, разработчик должен
- написать класс, который реализует метод <methodname>assert()</methodname>
- интерфейса:
- </para>
- <programlisting language="php"><![CDATA[
- class CleanIPAssertion implements Zend_Acl_Assert_Interface
- {
- public function assert(Zend_Acl $acl,
- Zend_Acl_Role_Interface $role = null,
- Zend_Acl_Resource_Interface $resource = null,
- $privilege = null)
- {
- return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
- }
- protected function _isCleanIP($ip)
- {
- // ...
- }
- }
- ]]></programlisting>
- <para>
- После объявления класса утверждения разработчик должен передавать
- экземпляр этого класса при определении условных правил. Правило,
- которое создается с утверждением, применяется
- только тогда, когда метод утверждения возвращает <constant>TRUE</constant>.
- </para>
- <programlisting language="php"><![CDATA[
- $acl = new Zend_Acl();
- $acl->allow(null, null, null, new CleanIPAssertion());
- ]]></programlisting>
- <para>
- Код выше создает условное правило, разрешающее
- всем доступ ко всем привилегиям всех ресурсов, за исключением
- случаев, когда IP-адрес запрашивающего занесен в "черный список".
- Если запрос приходит с IP-адреса, который не определяется как
- "белый", то правило не применяется.
- Поскольку правило применяется ко всем ролям, всем ресурсам и всем
- привилегиям, то "черный" IP приведет к запрещению доступа.
- Тем не менее, это особый случай, и следует понимать, что во всех
- других случаях (например, когда для правила были указаны роль,
- ресурс, или привилегия), невыполнение утверждения приводит к тому,
- что правило не применяется, и для определения того, разрешить ли
- доступ или запретить, могут использоваться другие правила.
- </para>
- <para>
- Методу <methodname>assert()</methodname> объекта утверждения передаются
- <acronym>ACL</acronym>, роль, ресурс и привилегия, к которым применяется запрос на
- авторизацию (например, <methodname>isAllowed()</methodname>). Это нужно для
- предоставления контекста классу утверждения и определения его
- условий там, где это нужно.
- </para>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|