dr inż. Piotr Czapiewski
Kontrola dostępu – Zend_Auth, Zend_Acl
Uwierzytelnianie – Zend_AuthAutoryzacja – Zend_Acl
Zend_Auth Obsługa logowania użytkowników Adaptery Obsługa konkretnej usługi uwierzytelniania Baza danych, LDAP, plik z listą użytkowników
Wzorzec Singleton Zend_Auth::getInstance() Dostęp do obiektu Zend_Auth Zend_Auth::getInstance()->hasIdenity() Sprawdzenie, czy użytkownik jest zalogowany
Adapter – Zend_Auth_Adapter_DbTable Pobiera dane użytkowników z tabeli w bazie danych Inicjalizacja adaptera Przekazanie loginu i hasła podanego przez użytkownika $db = Zend_Db_Table::getDefaultAdapter(); $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'uzytkownicy', 'nazwa', 'haslo'); $db = Zend_Db_Table::getDefaultAdapter(); $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'uzytkownicy', 'nazwa', 'haslo'); $authAdapter->setIdentity($dane['user']); $authAdapter->setCredential($dane['pass']);
Logowanie – c.d. Sprawdzenie loginu i hasła (porównanie z bazą danych) Czy autentykacja się powiodła? Zapamiętaj dane użytkownika w obiekcie Zend_Auth $result = $authAdapter->authenticate(); $result->isValid() $daneUzytkownika = $authAdapter->getResultRowObject(); Zend_Auth::getInstance()->getStorage()->write($daneUzytkownika);
$db = Zend_Db_Table::getDefaultAdapter(); $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'uzytkownicy', 'nazwa', 'haslo'); $authAdapter->setIdentity($dane['user']); $authAdapter->setCredential($dane['pass']); $result = $authAdapter->authenticate(); if($result->isValid()) { $daneUzytkownika = $authAdapter->getResultRowObject(); Zend_Auth::getInstance()->getStorage()->write($daneUzytkownika); $this->_helper->redirector('index', 'index'); } else { $this->view->komunikat = 'Logowanie nieudane'; } $db = Zend_Db_Table::getDefaultAdapter(); $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'uzytkownicy', 'nazwa', 'haslo'); $authAdapter->setIdentity($dane['user']); $authAdapter->setCredential($dane['pass']); $result = $authAdapter->authenticate(); if($result->isValid()) { $daneUzytkownika = $authAdapter->getResultRowObject(); Zend_Auth::getInstance()->getStorage()->write($daneUzytkownika); $this->_helper->redirector('index', 'index'); } else { $this->view->komunikat = 'Logowanie nieudane'; }
ACL – Acces Control List Określenie: Ról (np. „admin”, „user”, „gość”) Zasobów (np. akcje dodaj, edytuj, usuń, pokaż) Uprawnień ról do zasobów
$acl = new Zend_Acl(); $acl->addRole(new Zend_Acl_Role('guest')); $acl->addRole(new Zend_Acl_Role('user'), 'guest'); $acl->addRole(new Zend_Acl_Role('admin'), 'user'); $acl->addResource(new Zend_Acl_Resource('index')); $acl->addResource(new Zend_Acl_Resource('error')); $acl->addResource(new Zend_Acl_Resource('uzytkownicy')); $acl->allow('guest', 'index', 'index'); $acl->allow('guest', 'index', 'pokaz'); $acl->allow('guest', 'uzytkownicy', 'login'); $acl->allow('user', 'index', 'dodaj'); $acl->allow('user', 'index', 'edytuj'); $acl->allow('user', 'index', 'usun'); $acl->allow('user', 'uzytkownicy', 'logout'); $acl->allow('admin', null);
W którym miejscu sprawdzać uprawnienia? Plugin, metoda preDispatch – wywoływana przed obsługą żądania użytkownika Dodanie pluginu Klasa Blog_Plugin_AclPlugin /application/plugins/AclPlugin Dziedziczy z Zend_Controller_Plugin_Abstract Rejestracja pluginu – wpis w application.ini : resources.frontController.plugins.acl = "Blog_Plugin_AclPlugin"
public function preDispatch(Zend_Controller_Request_Abstract $request) { // Przygotuj ACL $acl = new Zend_Acl();... // Przeprowadź autoryzację // - sprawdź kto jest zalogowany – Zend_Auth // - sprawdź, czy ma uprawnienia do danej akcji // jeśli nie – przekieruj do error/noauth... } public function preDispatch(Zend_Controller_Request_Abstract $request) { // Przygotuj ACL $acl = new Zend_Acl();... // Przeprowadź autoryzację // - sprawdź kto jest zalogowany – Zend_Auth // - sprawdź, czy ma uprawnienia do danej akcji // jeśli nie – przekieruj do error/noauth... }
public function preDispatch(Zend_Controller_Request_Abstract $request) { // Przygotuj ACL $acl = new Zend_Acl(); $acl->addRole(new Zend_Acl_Role('guest')); $acl->addRole(new Zend_Acl_Role('user'), 'guest'); $acl->addRole(new Zend_Acl_Role('admin'), 'user'); $acl->addResource(new Zend_Acl_Resource('index')); $acl->addResource(new Zend_Acl_Resource('error')); $acl->addResource(new Zend_Acl_Resource('uzytkownicy')); $acl->allow('guest', 'index', 'index'); $acl->allow('guest', 'index', 'pokaz'); $acl->allow('guest', 'uzytkownicy', 'login'); $acl->allow('user', 'index', 'dodaj'); $acl->allow('user', 'index', 'edytuj'); $acl->allow('user', 'index', 'usun'); $acl->allow('user', 'uzytkownicy', 'logout'); $acl->allow('admin', null); // Przeprowadź autoryzację... }
public function preDispatch(Zend_Controller_Request_Abstract $request) { // Przygotuj ACL... // Przeprowadź autoryzację $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $role = $auth->getIdentity()->grupa; } else { $role = 'guest'; } $resource = $this->getRequest()->getControllerName(); $privilege = $this->getRequest()->getActionName(); if(!$acl->isAllowed($role, $resource, $privilege)) { if($role=='guest') { $request->setControllerName('uzytkownicy'); $request->setActionName('login'); } else { $request->setControllerName('error'); $request->setActionName('noauth'); } } }
Generowanie elementów nawigacyjnych Menu, breadcrumbs, mapa strony Kontrola dostępu we współpracy z Zend_Acl – wyświetlanie tych pozycji menu, do których zalogowany użytkownik ma prawa dostępu
$pages = array( array( 'label' => 'Strona główna', 'controller' => 'index', 'action' => 'index' ), array( 'label' => 'Dodaj wpis', 'controller' => 'index', 'action' => 'dodaj', 'resource' => 'index', 'privilege' => 'dodaj' ) ); $nav = new Zend_Navigation($pages); echo $this->navigation()->menu($nav); $pages = array( array( 'label' => 'Strona główna', 'controller' => 'index', 'action' => 'index' ), array( 'label' => 'Dodaj wpis', 'controller' => 'index', 'action' => 'dodaj', 'resource' => 'index', 'privilege' => 'dodaj' ) ); $nav = new Zend_Navigation($pages); echo $this->navigation()->menu($nav);