To będzie tak:
To przykładowy plik ini w którym trzymam prosty układ przywilejów:
acl.resources[] = "admin"
acl.resources[] = "developer"
acl.resources[] = "config"
acl.resources[] = "premium"
acl.resources[] = "nonpremium"
acl.resources[] = "guest"
acl.roles[] = "admin"
acl.roles[] = "developer"
acl.roles[] = "moderator"
acl.roles[] = "premium"
acl.roles[] = "nonpremium"
acl.roles[] = "guest"
acl.privilages.admin[] = "admin"
acl.privilages.admin[] = "config"
acl.privilages.admin[] = "guest"
acl.privilages.admin[] = "premium"
acl.privilages.admin[] = "nonpremium"
acl.privilages.moderator[] = "admin"
acl.privilages.moderator[] = "guest"
acl.privilages.developer[] = "admin"
acl.privilages.developer[] = "developer"
acl.privilages.developer[] = "config"
acl.privilages.developer[] = "premium"
acl.privilages.developer[] = "nonpremium"
acl.privilages.developer[] = "guest"
acl.privilages.premium[] = "premium"
acl.privilages.premium[] = "nonpremium"
acl.privilages.premium[] = "guest"
acl.privilages.nonpremium[] = "nonpremium"
acl.privilages.nonpremium[] = "guest"
acl.privilages.guest[] = "guest"
Tu muszę zaznaczyć (osoby które korzystają codziennie to widzą), że nie wykorzystałem dziedziczenia, aby ładnie to zobrazować.
Pierwsza część ("Resources") - zawiera informacje jakie grupy dostępu mamy. Druga część ("roles") zawiera informacje, jakie mamy grupy użytkowników. Tutaj jako resources mógłbym użyć grupy produktów. Pozostałe bloki przydzielają możliwość przeglądania danej grupy dostępów przez daną grupę użytkowników. Oczywiście samo wsadzenie tego do konfiguracji nic nie da - trzeba stworzyć plugin który pobierze tą konfiguruje i wsadzi wszystko w klasę Zend_Acl. To tego trzymam nawigację w Zend_Navigation (MVC) gdzie trzymam informację kto ma dostęp do danej strony.
Plugin wygląda tak:
class MyScripts_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$acl = new Zend_Acl();
$aclOptions = new Zend_Config_Ini(APPLICATION_PATH.'/configs/acl.ini','production'); //pobranie powyższej konfiguracji
$aclOptions = $aclOptions->toArray();
$aclOptions = $aclOptions['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['privilages'] as $role=>$resource){
foreach ($resource as $res){
}else{
$acl->allow($role,$res);
}
}
}
//do tego momentu pobrano konfigurację w umieszczono ją w Zend_Acl
Zend_Registry::set('Zend_Acl', $acl);
$navigationConfig = new Zend_Config_Xml(APPLICATION_PATH.'/configs/navigation.xml','navpage'); //pobranie nawigacji (Zend_Navigation)
$navigation = new Zend_Navigation($navigationConfig->toArray());
Zend_Registry::set('Zend_Navigation',$navigation);
Zend_View_Helper_Navigation::setDefaultAcl($acl); //Tutaj nawigacji przekazuje acl'a, tak aby nawigacja wyświetlała tylko te strony, do których użytkownik ma dostęp (czego oczy nie widzą, tego sercu nie żal)
if (Zend_Auth::getInstance()->hasIdentity()){ //jeżeli user jest zalogowany
Zend_View_Helper_Navigation::setDefaultRole(Zend_Auth::getInstance()->getIdentity()->role);
}else{
Zend_View_Helper_Navigation::setDefaultRole('guest');
}
// !!!
// $pagepriv = $navigation->findOneBy('active', 1); //Tak można wyciągnąć stronę na której aktualnie się znajdujemy (dodaje, bo wiele osób ma z tym problem)
// !!!
if (Zend_Auth::getInstance()->hasIdentity()){
$role = Zend_Auth::getInstance()->getIdentity()->role;
}else{
$role = 'guest';
}
if (!$acl->isAllowed($role,$pagepriv)){ //sprawdzamy, czy użytkownik może tutaj przebywać, jeżeli nie, to wyświetlamy mu stronę z brakiem uprawnień
$request->setModuleName('default');
$request->setControllerName('Error');
$request->setActionName('denied');
}
}
}
Jeszcze kilka rzeczy wymaga naprawienia, więc jak ktoś coś poprawi w klasie, to niech da znać