1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.acl.refining">
5 <title>Analiza kontroli dostępu</title>
7 <sect2 id="zend.acl.refining.precise">
9 <title>Precyzyjna kontrola dostępu</title>
12 Podstawowe <acronym>ACL</acronym> zdefiniowane w
13 <link linkend="zend.acl.introduction">poprzedniej sekcji</link> pokazują
14 jakie rozmaite uprawnienia mogą być dozwolone dla <acronym>ACL</acronym>
15 (dla wszystkich zasobów). W praktyce, kontrola dostępu ma skłonność do
16 posiadania wyjątków od reguł oraz różnych stopni skomplikowania.
17 <classname>Zend_Acl</classname> pozwoli ci przeprowadzić te analizy
18 w przystępny i elastyczny sposób.
22 W przykładowej aplikacji <acronym>CMS</acronym>, zostało zdecydowane,
23 że podczas gdy grupa 'staff' pokryje potrzeby większości użytkowników,
24 potrzebna jest jeszcze jedna nowa grupa 'marketing', która wymaga dostępu
25 do newslettera oraz ostatnich nowości w <acronym>CMS</acronym>. Ta grupa
26 jest naprawdę samowystarczalna i będzie dawała możliwość publikowania oraz
27 archiwizowania zarówno newsletterów jak i ostatnich nowości.
31 Dodatkowo, zażądano także aby grupa 'staff' miała pozwolenie do
32 przeglądania nowości, ale żeby nie mogła przeglądać ostatnich nowości.
33 Dodatkowo, archiwizowanie 'zapowiedzi' nie powinno być w ogóle możliwe
34 (nawet przez administratora), ponieważ ich okres ważności to 1-2 dni.
38 Wpierw przejrzymy rejestr ról, aby rozważyć te zmiany. Określiliśmy, że
39 grupa 'marketing' ma te same podstawowe uprawnienia co grupa 'staff',
40 więc zdefiniujemy grupę 'marketing' w taki sposób, aby dziedziczyła
41 uprawnienia od grupy 'staff':
44 <programlisting language="php"><![CDATA[
45 // Nowa grupa marketing dziedziczy uprawnienia od grupy staff
46 $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
50 Zauważ, że powyższa kontrola dostępu odnosi się do określonych zasobów
51 (np., "newsletter", "ostatnie nowości", "zapowiedzi"). Teraz dodamy te
55 <programlisting language="php"><![CDATA[
56 // Utwórz zasoby dla reguł
59 $acl->add(new Zend_Acl_Resource('newsletter'));
62 $acl->add(new Zend_Acl_Resource('news'));
65 $acl->add(new Zend_Acl_Resource('latest'), 'news');
68 $acl->add(new Zend_Acl_Resource('announcement'), 'news');
72 Teraz prostą sprawą jest zdefiniowanie bardziej specyficznych reguł
73 na docelowych obszarach <acronym>ACL</acronym>:
76 <programlisting language="php"><![CDATA[
77 // Grupa marketing musi mieć możliwość publikowania i archiwizowania
78 // newsletterów oraz ostatnich nowości
79 $acl->allow('marketing',
80 array('newsletter', 'latest'),
81 array('publish', 'archive'));
83 // Grupa Staff (oraz marketing przez dziedziczenie), ma zabroniony dostęp
84 // do przeglądania ostatnich nowości
85 $acl->deny('staff', 'latest', 'revise');
87 // Każdy (włączając w to administratorów) ma zabroniony dostęp do
88 // archiwizowania zapowiedzi
89 $acl->deny(null, 'announcement', 'archive');
93 Teraz możemy przeprowadzić zapytanie do <acronym>ACL</acronym> z
94 uwzględnieniem ostatnich zmian:
97 <programlisting language="php"><![CDATA[
98 echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
102 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
103 "allowed" : "denied";
106 echo $acl->isAllowed('staff', 'latest', 'publish') ?
107 "allowed" : "denied";
110 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
111 "allowed" : "denied";
114 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
115 "allowed" : "denied";
118 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
119 "allowed" : "denied";
122 echo $acl->isAllowed('editor', 'announcement', 'archive') ?
123 "allowed" : "denied";
126 echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
127 "allowed" : "denied";
133 <sect2 id="zend.acl.refining.removing">
135 <title>Usuwanie kontroli dostępu</title>
138 Aby usunąć jedną lub więcej reguł z <acronym>ACL</acronym>, po prostu użyj
139 dostępnych metod <methodname>removeAllow()</methodname> lub
140 <methodname>removeDeny()</methodname>. Podobnie jak w metodach
141 <methodname>allow()</methodname> oraz <methodname>deny()</methodname>,
142 możesz podać wartość <constant>NULL</constant> aby oznaczyć wszystkie
143 role, wszystkie zasoby i/lub wszystkie przywileje:
146 <programlisting language="php"><![CDATA[
147 // Usunięcie zabronienia możliwości przeglądania ostatnich nowości
148 // przez grupę staff (oraz marketing, przez dziedziczenie)
149 $acl->removeDeny('staff', 'latest', 'revise');
151 echo $acl->isAllowed('marketing', 'latest', 'revise') ?
152 "allowed" : "denied";
155 // Usunięcie wszystkich pozwoleń publikowania i archiwizowania newsletterów
156 // przez grupę marketing
157 $acl->removeAllow('marketing', 'newsletter', array('publish', 'archive'));
159 echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
160 "allowed" : "denied";
163 echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
164 "allowed" : "denied";
169 Przywileje mogą być modyfikowane inkrementalnie jak pokazano wyżej, ale
170 wartość <constant>NULL</constant> dla przywilejów nadpisuje te inkrementalne
174 <programlisting language="php"><![CDATA[
175 // Nadanie grupie marketing wszystkich uprawnień związanych z ostatnimi nowościami
176 $acl->allow('marketing', 'latest');
178 echo $acl->isAllowed('marketing', 'latest', 'publish') ?
179 "allowed" : "denied";
182 echo $acl->isAllowed('marketing', 'latest', 'archive') ?
183 "allowed" : "denied";
186 echo $acl->isAllowed('marketing', 'latest', 'anything') ?
187 "allowed" : "denied";