[MANUAL] English:
[zend.git] / documentation / manual / ru / module_specs / Zend_Acl-Refining.xml
blob6e4a849517ce0cba372db078c998376f5c4c9e54
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect1 id="zend.acl.refining">
5     <title>Настройка управления доступом</title>
7     <sect2 id="zend.acl.refining.precise">
9         <title>Точное управление доступом</title>
11         <para>
12             Базовый <acronym>ACL</acronym>, как было описано в
13             <link linkend="zend.acl.introduction">предыдущем разделе</link>,
14             демонстрирует, как
15             различные привилегии могут быть разрешены в <acronym>ACL</acronym> (ко всем ресурсам).
16             Но на практике средства управления доступом
17             имеют тенденцию к тому, чтобы иметь исключения из правил и различную
18             степень сложности. <classname>Zend_Acl</classname> позволяет производить
19             детализацию просто и гибко.
20         </para>
22         <para>
23             Для <acronym>CMS</acronym> из нашего примера было установлено, что хотя группа
24             'сотрудник' подходит большинству пользователей,
25             возникла необходимость в новой группе 'маркетинг', которая имела бы
26             доступ к подписке и последним новостям в CMS.
27             Группа в некоторой степени самодостаточна и будет иметь возможность
28             публиковать и удалять как подписки, так и последние новости.
29         </para>
31         <para>
32             Кроме этого, необходимо, чтобы группе 'сотрудник' было разрешено
33             просматривать новости, но запрещено редактировать их. И наконец,
34             должно быть запрещено всем (в том числе и администраторам)
35             помещать в архив любые 'объявления', если с момента добавления
36             прошло только 1-2 дня.
37        </para>
39         <para>
40             В первую очередь мы модифицируем реестр ролей для отражения
41             этих изменений. Мы определили,
42             что группа 'маркетинг' имеет те же базовые права, что и 'сотрудник',
43             поэтому мы определим 'маркетинг' таким образом, чтобы она
44             наследовала права группы 'сотрудник':
45         </para>
47         <programlisting language="php"><![CDATA[
48 // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
49 $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
50 ]]></programlisting>
52         <para>
53             Далее обратите внимание, что указанные выше права доступа имеют
54             отношение к особым ресурсам (например, "подписка", "последние
55             новости"). Теперь добавим эти ресурсы:
56         </para>
58         <programlisting language="php"><![CDATA[
59 // Создаем ресурсы для этих ролей
61 // подписка
62 $acl->add(new Zend_Acl_Resource('newsletter'));
64 // новости
65 $acl->add(new Zend_Acl_Resource('news'));
67 // последние новости
68 $acl->add(new Zend_Acl_Resource('latest'), 'news');
70 // объявления
71 $acl->add(new Zend_Acl_Resource('announcement'), 'news');
72 ]]></programlisting>
74         <para>
75             Затем определяются более точные правила для целевых областей <acronym>ACL</acronym>.
76         </para>
78         <programlisting language="php"><![CDATA[
79 // Маркетинг должен иметь возможность публиковать и удалять подписку
80 // и последние новости
81 $acl->allow('marketing',
82             array('newsletter', 'latest'),
83             array('publish', 'archive'));
85 // Пользователю (и маркетингу через наследование), запрещено редактировать
86 // последние новости
87 $acl->deny('staff', 'latest', 'revise');
89 // Всем, включая администраторов, не разрешается удалять объявления
90 $acl->deny(null, 'announcement', 'archive');
91 ]]></programlisting>
93         <para>
94             Теперь мы можем производить запросы к <acronym>ACL</acronym> с учетом последних
95             изменений:
96         </para>
98         <programlisting language="php"><![CDATA[
99 echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
100      "разрешен" : "запрещен";
101 // запрещен
103 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
104      "разрешен" : "запрещен";
105 // разрешен
107 echo $acl->isAllowed('staff', 'latest', 'publish') ?
108      "разрешен" : "запрещен";
109 // запрещен
111 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
112      "разрешен" : "запрещен";
113 // разрешен
115 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
116      "разрешен" : "запрещен";
117 // разрешен
119 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
120      "разрешен" : "запрещен";
121 // запрещен
123 echo $acl->isAllowed('editor', 'announcement', 'archive') ?
124      "разрешен" : "запрещен";
125 // запрещен
127 echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
128      "разрешен" : "запрещен";
129 // запрещен
130 ]]></programlisting>
132     </sect2>
134     <sect2 id="zend.acl.refining.removing">
136         <title>Удаление правил доступа</title>
138         <para>
139             Для того, чтобы удалить одно или несколько правил из <acronym>ACL</acronym>,
140             используйте методы <code>removeAllow()</code>
141             или <code>removeDeny()</code>. Как и в случае с <code>allow()</code>
142             и <code>deny()</code>, вы можете передавать
143             <constant>NULL</constant> в качестве параметра, чтобы применить метод ко
144             всем ролям, ресурсам, и/или привилегиям:
145         </para>
147         <programlisting language="php"><![CDATA[
148 // Убираем запрет на редактирование последних новостей для 'пользователя'
149 // (и маркетинга через наследование)
150 $acl->removeDeny('staff', 'latest', 'revise');
152 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
153      "разрешен" : "запрещен";
154 // разрешен
156 // Убираем разрешение на публикацию и удаление подписки для маркетинга
157 $acl->removeAllow('marketing',
158                   'newsletter',
159                   array('publish', 'archive'));
161 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
162      "разрешен" : "запрещен";
163 // запрещен
165 echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
166      "разрешен" : "запрещен";
167 // запрещен
168 ]]></programlisting>
170         <para>
171             Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр <constant>NULL</constant>
172             для привилегий переопределяет такой порядок изменений:
173         </para>
175         <programlisting language="php"><![CDATA[
176 // Разрешить маркетингу все действия над последними новостями
177 $acl->allow('marketing', 'latest');
179 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
180      "разрешен" : "запрещен";
181 // разрешен
183 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
184      "разрешен" : "запрещен";
185 // разрешен
187 echo $acl->isAllowed('marketing', 'latest', 'anything') ?
188      "разрешен" : "запрещен";
189 // разрешен
190 ]]></programlisting>
192     </sect2>
194 </sect1>
195 <!--
196 vim:se ts=4 sw=4 et: