Autor wpisu: batman, dodany: 19.05.2011 18:00, tagi: zend_framework
Zend_Acl jest jednym z komponentów Zend Frameworka, bez których tworzenie rozbudowanych aplikacji byłoby znacznie trudniejsze. W skrócie Zend_Acl dostarcza informację o tym, czy rola ma dostęp do zasobu. Utworzenie zależności między rolami oraz zasobami spoczywa na naszych barkach, podobnie jak wykonanie odpowiedniej akcji w przypadku braku dostępu. Manual świetnie opisuje sposoby dodawania ról, zasobów oraz zależności między nimi. Niestety ani słowem nie wspomina o sposobie wykorzystania tej wiedzy w prawdziwej aplikacji.
Definiowanie zasobów i ról
Pierwszym etapem w tworzeniu aplikacji korzystającej z Zend_Acl jest określenie ról oraz zasobów występujących w aplikacji. Sposobów przechowywania tych informacji jest kilka, od plików ini począwszy, na bazie danych kończąc. Ponieważ sposoby te różnią się od siebie tylko sposobem przechowywania danych, do przykładów będę stosował pliki ini.
Zdefiniujmy najpierw zasoby.
acl.resources[] = "index_index" acl.resources[] = "user_list" acl.resources[] = "user_edit" acl.resources[] = "user_add" acl.resources[] = "user_delete"
Jak zapewne się domyślacie, pierwszy człon nazwy zasobu określa nazwę kontrolera, drugi nazwę akcji. Jeśli w aplikacji występują moduły, przez nazwą kontrolera można dodać kolejny człon oznaczający nazwę modułu.
Role definiujemy w podobny sposób.
acl.roles[] = "admin" acl.roles[] = "user" acl.roles[] = "guest"
Na koniec pozostaje zdefiniowanie praw dostępu
acl.privileges.admin[] = "index_index" acl.privileges.admin[] = "user_list" acl.privileges.admin[] = "user_edit" acl.privileges.admin[] = "user_add" acl.privileges.admin[] = "user_delete" acl.privileges.user[] = "index_index" acl.privileges.user[] = "user_list" acl.privileges.guest[] = "index_index"
Powyższy schemat dodawania ról, zasobów oraz uprawnień ma ta zaletę, iż w przypadku szybko rosnącej aplikacji można go bez problemowo przenieść np. do bazy danych, napisać prosty panel do zarządzania i zapomnieć o uzupełnianiu danych “z palca”.
Tworzymy ACL
Najlepszym miejscem do utworzenia Zend_Acl jest bootstrap.
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAcl() { $acl = new Zend_Acl(); $aclOptions = $this->getOption('acl'); foreach($aclOptions['roles'] as $role) { $acl->addRole(new Zend_Acl_Role($role)); } foreach($aclOptions['resources'] as $resource) { $acl->addResource(new Zend_Acl_Resource($resource)); } foreach($aclOptions['privileges'] as $role => $resource) { $acl->allow($role, $resource); } return $acl; } }
Dlaczego właśnie bootstrap? Ponieważ w prosty sposób bez konieczności korzystania z rejestru możemy dostać się do obiektu Zend_Acl oraz bootstrap wykonuje się zawsze wykonuje jako pierwszy.
Warto wykorzystać tutaj cache, ponieważ generowanie całej listy ACL przy każdym żądaniu może mieć wpływ na wydajność aplikacji.