| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.acl.refining">
- <title>Настройка управления доступом</title>
- <sect2 id="zend.acl.refining.precise">
- <title>Точное управление доступом</title>
- <para>
- Базовый <acronym>ACL</acronym>, как было описано в
- <link linkend="zend.acl.introduction">предыдущем разделе</link>,
- демонстрирует, как
- различные привилегии могут быть разрешены в <acronym>ACL</acronym> (ко всем ресурсам).
- Но на практике средства управления доступом
- имеют тенденцию к тому, чтобы иметь исключения из правил и различную
- степень сложности. <classname>Zend_Acl</classname> позволяет производить
- детализацию просто и гибко.
- </para>
- <para>
- Для <acronym>CMS</acronym> из нашего примера было установлено, что хотя группа
- 'сотрудник' подходит большинству пользователей,
- возникла необходимость в новой группе 'маркетинг', которая имела бы
- доступ к подписке и последним новостям в <acronym>CMS</acronym>.
- Группа в некоторой степени самодостаточна и будет иметь возможность
- публиковать и удалять как подписки, так и последние новости.
- </para>
- <para>
- Кроме этого, необходимо, чтобы группе 'сотрудник' было разрешено
- просматривать новости, но запрещено редактировать их. И наконец,
- должно быть запрещено всем (в том числе и администраторам)
- помещать в архив любые 'объявления', если с момента добавления
- прошло только 1-2 дня.
- </para>
- <para>
- В первую очередь мы модифицируем реестр ролей для отражения
- этих изменений. Мы определили,
- что группа 'маркетинг' имеет те же базовые права, что и 'сотрудник',
- поэтому мы определим 'маркетинг' таким образом, чтобы она
- наследовала права группы 'сотрудник':
- </para>
- <programlisting language="php"><![CDATA[
- // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
- $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
- ]]></programlisting>
- <para>
- Далее обратите внимание, что указанные выше права доступа имеют
- отношение к особым ресурсам (например, "подписка", "последние
- новости"). Теперь добавим эти ресурсы:
- </para>
- <programlisting language="php"><![CDATA[
- // Создаем ресурсы для этих ролей
- // подписка
- $acl->add(new Zend_Acl_Resource('newsletter'));
- // новости
- $acl->add(new Zend_Acl_Resource('news'));
- // последние новости
- $acl->add(new Zend_Acl_Resource('latest'), 'news');
- // объявления
- $acl->add(new Zend_Acl_Resource('announcement'), 'news');
- ]]></programlisting>
- <para>
- Затем определяются более точные правила для целевых областей <acronym>ACL</acronym>.
- </para>
- <programlisting language="php"><![CDATA[
- // Маркетинг должен иметь возможность публиковать и удалять подписку
- // и последние новости
- $acl->allow('marketing',
- array('newsletter', 'latest'),
- array('publish', 'archive'));
- // Пользователю (и маркетингу через наследование), запрещено редактировать
- // последние новости
- $acl->deny('staff', 'latest', 'revise');
- // Всем, включая администраторов, не разрешается удалять объявления
- $acl->deny(null, 'announcement', 'archive');
- ]]></programlisting>
- <para>
- Теперь мы можем производить запросы к <acronym>ACL</acronym> с учетом последних
- изменений:
- </para>
- <programlisting language="php"><![CDATA[
- echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
- "разрешен" : "запрещен";
- // запрещен
- echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
- "разрешен" : "запрещен";
- // разрешен
- echo $acl->isAllowed('staff', 'latest', 'publish') ?
- "разрешен" : "запрещен";
- // запрещен
- echo $acl->isAllowed('marketing', 'latest', 'publish') ?
- "разрешен" : "запрещен";
- // разрешен
- echo $acl->isAllowed('marketing', 'latest', 'archive') ?
- "разрешен" : "запрещен";
- // разрешен
- echo $acl->isAllowed('marketing', 'latest', 'revise') ?
- "разрешен" : "запрещен";
- // запрещен
- echo $acl->isAllowed('editor', 'announcement', 'archive') ?
- "разрешен" : "запрещен";
- // запрещен
- echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
- "разрешен" : "запрещен";
- // запрещен
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.acl.refining.removing">
- <title>Удаление правил доступа</title>
- <para>
- Для того, чтобы удалить одно или несколько правил из <acronym>ACL</acronym>,
- используйте методы <methodname>removeAllow()</methodname>
- или <methodname>removeDeny()</methodname>. Как и в случае с
- <methodname>allow()</methodname> и <methodname>deny()</methodname>, вы можете передавать
- <constant>NULL</constant> в качестве параметра, чтобы применить метод ко
- всем ролям, ресурсам, и/или привилегиям:
- </para>
- <programlisting language="php"><![CDATA[
- // Убираем запрет на редактирование последних новостей для 'пользователя'
- // (и маркетинга через наследование)
- $acl->removeDeny('staff', 'latest', 'revise');
- echo $acl->isAllowed('marketing', 'latest', 'revise') ?
- "разрешен" : "запрещен";
- // разрешен
- // Убираем разрешение на публикацию и удаление подписки для маркетинга
- $acl->removeAllow('marketing',
- 'newsletter',
- array('publish', 'archive'));
- echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
- "разрешен" : "запрещен";
- // запрещен
- echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
- "разрешен" : "запрещен";
- // запрещен
- ]]></programlisting>
- <para>
- Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр
- <constant>NULL</constant> для привилегий переопределяет такой порядок изменений:
- </para>
- <programlisting language="php"><![CDATA[
- // Разрешить маркетингу все действия над последними новостями
- $acl->allow('marketing', 'latest');
- echo $acl->isAllowed('marketing', 'latest', 'publish') ?
- "разрешен" : "запрещен";
- // разрешен
- echo $acl->isAllowed('marketing', 'latest', 'archive') ?
- "разрешен" : "запрещен";
- // разрешен
- echo $acl->isAllowed('marketing', 'latest', 'anything') ?
- "разрешен" : "запрещен";
- // разрешен
- ]]></programlisting>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|