1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.acl.refining">
5 <title>Настройка управления доступом</title>
7 <sect2 id="zend.acl.refining.precise">
9 <title>Точное управление доступом</title>
12 Базовый <acronym>ACL</acronym>, как было описано в
13 <link linkend="zend.acl.introduction">предыдущем разделе</link>,
15 различные привилегии могут быть разрешены в <acronym>ACL</acronym> (ко всем ресурсам).
16 Но на практике средства управления доступом
17 имеют тенденцию к тому, чтобы иметь исключения из правил и различную
18 степень сложности. <classname>Zend_Acl</classname> позволяет производить
19 детализацию просто и гибко.
23 Для <acronym>CMS</acronym> из нашего примера было установлено, что хотя группа
24 'сотрудник' подходит большинству пользователей,
25 возникла необходимость в новой группе 'маркетинг', которая имела бы
26 доступ к подписке и последним новостям в CMS.
27 Группа в некоторой степени самодостаточна и будет иметь возможность
28 публиковать и удалять как подписки, так и последние новости.
32 Кроме этого, необходимо, чтобы группе 'сотрудник' было разрешено
33 просматривать новости, но запрещено редактировать их. И наконец,
34 должно быть запрещено всем (в том числе и администраторам)
35 помещать в архив любые 'объявления', если с момента добавления
36 прошло только 1-2 дня.
40 В первую очередь мы модифицируем реестр ролей для отражения
41 этих изменений. Мы определили,
42 что группа 'маркетинг' имеет те же базовые права, что и 'сотрудник',
43 поэтому мы определим 'маркетинг' таким образом, чтобы она
44 наследовала права группы 'сотрудник':
47 <programlisting language="php"><![CDATA[
48 // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
49 $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
53 Далее обратите внимание, что указанные выше права доступа имеют
54 отношение к особым ресурсам (например, "подписка", "последние
55 новости"). Теперь добавим эти ресурсы:
58 <programlisting language="php"><![CDATA[
59 // Создаем ресурсы для этих ролей
62 $acl->add(new Zend_Acl_Resource('newsletter'));
65 $acl->add(new Zend_Acl_Resource('news'));
68 $acl->add(new Zend_Acl_Resource('latest'), 'news');
71 $acl->add(new Zend_Acl_Resource('announcement'), 'news');
75 Затем определяются более точные правила для целевых областей <acronym>ACL</acronym>.
78 <programlisting language="php"><![CDATA[
79 // Маркетинг должен иметь возможность публиковать и удалять подписку
80 // и последние новости
81 $acl->allow('marketing',
82 array('newsletter', 'latest'),
83 array('publish', 'archive'));
85 // Пользователю (и маркетингу через наследование), запрещено редактировать
87 $acl->deny('staff', 'latest', 'revise');
89 // Всем, включая администраторов, не разрешается удалять объявления
90 $acl->deny(null, 'announcement', 'archive');
94 Теперь мы можем производить запросы к <acronym>ACL</acronym> с учетом последних
98 <programlisting language="php"><![CDATA[
99 echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
100 "разрешен" : "запрещен";
103 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
104 "разрешен" : "запрещен";
107 echo $acl->isAllowed('staff', 'latest', 'publish') ?
108 "разрешен" : "запрещен";
111 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
112 "разрешен" : "запрещен";
115 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
116 "разрешен" : "запрещен";
119 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
120 "разрешен" : "запрещен";
123 echo $acl->isAllowed('editor', 'announcement', 'archive') ?
124 "разрешен" : "запрещен";
127 echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
128 "разрешен" : "запрещен";
134 <sect2 id="zend.acl.refining.removing">
136 <title>Удаление правил доступа</title>
139 Для того, чтобы удалить одно или несколько правил из <acronym>ACL</acronym>,
140 используйте методы <code>removeAllow()</code>
141 или <code>removeDeny()</code>. Как и в случае с <code>allow()</code>
142 и <code>deny()</code>, вы можете передавать
143 <constant>NULL</constant> в качестве параметра, чтобы применить метод ко
144 всем ролям, ресурсам, и/или привилегиям:
147 <programlisting language="php"><![CDATA[
148 // Убираем запрет на редактирование последних новостей для 'пользователя'
149 // (и маркетинга через наследование)
150 $acl->removeDeny('staff', 'latest', 'revise');
152 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
153 "разрешен" : "запрещен";
156 // Убираем разрешение на публикацию и удаление подписки для маркетинга
157 $acl->removeAllow('marketing',
159 array('publish', 'archive'));
161 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
162 "разрешен" : "запрещен";
165 echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
166 "разрешен" : "запрещен";
171 Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр <constant>NULL</constant>
172 для привилегий переопределяет такой порядок изменений:
175 <programlisting language="php"><![CDATA[
176 // Разрешить маркетингу все действия над последними новостями
177 $acl->allow('marketing', 'latest');
179 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
180 "разрешен" : "запрещен";
183 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
184 "разрешен" : "запрещен";
187 echo $acl->isAllowed('marketing', 'latest', 'anything') ?
188 "разрешен" : "запрещен";