| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.acl.refining">
- <title>Analiza kontroli dostępu</title>
- <sect2 id="zend.acl.refining.precise">
- <title>Precyzyjna kontrola dostępu</title>
- <para>
- Podstawowe <acronym>ACL</acronym> zdefiniowane w
- <link linkend="zend.acl.introduction">poprzedniej sekcji</link> pokazują
- jakie rozmaite uprawnienia mogą być dozwolone dla <acronym>ACL</acronym>
- (dla wszystkich zasobów). W praktyce, kontrola dostępu ma skłonność do
- posiadania wyjątków od reguł oraz różnych stopni skomplikowania.
- <classname>Zend_Acl</classname> pozwoli ci przeprowadzić te analizy
- w przystępny i elastyczny sposób.
- </para>
- <para>
- W przykładowej aplikacji <acronym>CMS</acronym>, zostało zdecydowane,
- że podczas gdy grupa 'staff' pokryje potrzeby większości użytkowników,
- potrzebna jest jeszcze jedna nowa grupa 'marketing', która wymaga dostępu
- do newslettera oraz ostatnich nowości w <acronym>CMS</acronym>. Ta grupa
- jest naprawdę samowystarczalna i będzie dawała możliwość publikowania oraz
- archiwizowania zarówno newsletterów jak i ostatnich nowości.
- </para>
- <para>
- Dodatkowo, zażądano także aby grupa 'staff' miała pozwolenie do
- przeglądania nowości, ale żeby nie mogła przeglądać ostatnich nowości.
- Dodatkowo, archiwizowanie 'zapowiedzi' nie powinno być w ogóle możliwe
- (nawet przez administratora), ponieważ ich okres ważności to 1-2 dni.
- </para>
- <para>
- Wpierw przejrzymy rejestr ról, aby rozważyć te zmiany. Określiliśmy, że
- grupa 'marketing' ma te same podstawowe uprawnienia co grupa 'staff',
- więc zdefiniujemy grupę 'marketing' w taki sposób, aby dziedziczyła
- uprawnienia od grupy 'staff':
- </para>
- <programlisting language="php"><![CDATA[
- // Nowa grupa marketing dziedziczy uprawnienia od grupy staff
- $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
- ]]></programlisting>
- <para>
- Zauważ, że powyższa kontrola dostępu odnosi się do określonych zasobów
- (np., "newsletter", "ostatnie nowości", "zapowiedzi"). Teraz dodamy te
- zasoby:
- </para>
- <programlisting language="php"><![CDATA[
- // Utwórz zasoby dla reguł
- // newsletter
- $acl->add(new Zend_Acl_Resource('newsletter'));
- // nowości
- $acl->add(new Zend_Acl_Resource('news'));
- // ostatnie nowości
- $acl->add(new Zend_Acl_Resource('latest'), 'news');
- // zapowiedzi
- $acl->add(new Zend_Acl_Resource('announcement'), 'news');
- ]]></programlisting>
- <para>
- Teraz prostą sprawą jest zdefiniowanie bardziej specyficznych reguł
- na docelowych obszarach <acronym>ACL</acronym>:
- </para>
- <programlisting language="php"><![CDATA[
- // Grupa marketing musi mieć możliwość publikowania i archiwizowania
- // newsletterów oraz ostatnich nowości
- $acl->allow('marketing',
- array('newsletter', 'latest'),
- array('publish', 'archive'));
- // Grupa Staff (oraz marketing przez dziedziczenie), ma zabroniony dostęp
- // do przeglądania ostatnich nowości
- $acl->deny('staff', 'latest', 'revise');
- // Każdy (włączając w to administratorów) ma zabroniony dostęp do
- // archiwizowania zapowiedzi
- $acl->deny(null, 'announcement', 'archive');
- ]]></programlisting>
- <para>
- Teraz możemy przeprowadzić zapytanie do <acronym>ACL</acronym> z
- uwzględnieniem ostatnich zmian:
- </para>
- <programlisting language="php"><![CDATA[
- echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
- "allowed" : "denied";
- // zabronione
- echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
- "allowed" : "denied";
- // dozwolone
- echo $acl->isAllowed('staff', 'latest', 'publish') ?
- "allowed" : "denied";
- // zabronione
- echo $acl->isAllowed('marketing', 'latest', 'publish') ?
- "allowed" : "denied";
- // dozwolone
- echo $acl->isAllowed('marketing', 'latest', 'archive') ?
- "allowed" : "denied";
- // dozwolone
- echo $acl->isAllowed('marketing', 'latest', 'revise') ?
- "allowed" : "denied";
- // zabronione
- echo $acl->isAllowed('editor', 'announcement', 'archive') ?
- "allowed" : "denied";
- // zabronione
- echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
- "allowed" : "denied";
- // zabronione
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.acl.refining.removing">
- <title>Usuwanie kontroli dostępu</title>
- <para>
- Aby usunąć jedną lub więcej reguł z <acronym>ACL</acronym>, po prostu użyj
- dostępnych metod <methodname>removeAllow()</methodname> lub
- <methodname>removeDeny()</methodname>. Podobnie jak w metodach
- <methodname>allow()</methodname> oraz <methodname>deny()</methodname>,
- możesz podać wartość <constant>NULL</constant> aby oznaczyć wszystkie
- role, wszystkie zasoby i/lub wszystkie przywileje:
- </para>
- <programlisting language="php"><![CDATA[
- // Usunięcie zabronienia możliwości przeglądania ostatnich nowości
- // przez grupę staff (oraz marketing, przez dziedziczenie)
- $acl->removeDeny('staff', 'latest', 'revise');
- echo $acl->isAllowed('marketing', 'latest', 'revise') ?
- "allowed" : "denied";
- // dozwolone
- // Usunięcie wszystkich pozwoleń publikowania i archiwizowania newsletterów
- // przez grupę marketing
- $acl->removeAllow('marketing', 'newsletter', array('publish', 'archive'));
- echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
- "allowed" : "denied";
- // zabronione
- echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
- "allowed" : "denied";
- // zabronione
- ]]></programlisting>
- <para>
- Przywileje mogą być modyfikowane inkrementalnie jak pokazano wyżej, ale
- wartość <constant>NULL</constant> dla przywilejów nadpisuje te inkrementalne
- zmiany:
- </para>
- <programlisting language="php"><![CDATA[
- // Nadanie grupie marketing wszystkich uprawnień związanych z ostatnimi nowościami
- $acl->allow('marketing', 'latest');
- echo $acl->isAllowed('marketing', 'latest', 'publish') ?
- "allowed" : "denied";
- // dozwolone
- echo $acl->isAllowed('marketing', 'latest', 'archive') ?
- "allowed" : "denied";
- // dozwolone
- echo $acl->isAllowed('marketing', 'latest', 'anything') ?
- "allowed" : "denied";
- // dozwolone
- ]]></programlisting>
- </sect2>
- </sect1>
|