Analiza kontroli dostępuPrecyzyjna kontrola dostępu
Podstawowe ACL zdefiniowane w
poprzedniej sekcji pokazują
jakie rozmaite uprawnienia mogą być dozwolone dla ACL
(dla wszystkich zasobów). W praktyce, kontrola dostępu ma skłonność do
posiadania wyjątków od reguł oraz różnych stopni skomplikowania.
Zend_Acl pozwoli ci przeprowadzić te analizy
w przystępny i elastyczny sposób.
W przykładowej aplikacji CMS, 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 CMS. Ta grupa
jest naprawdę samowystarczalna i będzie dawała możliwość publikowania oraz
archiwizowania zarówno newsletterów jak i ostatnich nowości.
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.
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':
addRole(new Zend_Acl_Role('marketing'), 'staff');
]]>
Zauważ, że powyższa kontrola dostępu odnosi się do określonych zasobów
(np., "newsletter", "ostatnie nowości", "zapowiedzi"). Teraz dodamy te
zasoby:
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');
]]>
Teraz prostą sprawą jest zdefiniowanie bardziej specyficznych reguł
na docelowych obszarach 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');
]]>
Teraz możemy przeprowadzić zapytanie do ACL z
uwzględnieniem ostatnich zmian:
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
]]>Usuwanie kontroli dostępu
Aby usunąć jedną lub więcej reguł z ACL, po prostu użyj
dostępnych metod removeAllow() lub
removeDeny(). Podobnie jak w metodach
allow() oraz deny(),
możesz podać wartość NULL aby oznaczyć wszystkie
role, wszystkie zasoby i/lub wszystkie przywileje:
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
]]>
Przywileje mogą być modyfikowane inkrementalnie jak pokazano wyżej, ale
wartość NULL dla przywilejów nadpisuje te inkrementalne
zmiany:
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
]]>