Dr inż. Piotr Czapiewski. Kontrola dostępu – Zend_Auth, Zend_Acl.

1 dr inż. Piotr Czapiewski ...
Author: Aleksandra Czech
0 downloads 0 Views

1 dr inż. Piotr Czapiewski

2 Kontrola dostępu – Zend_Auth, Zend_Acl

3 Uwierzytelnianie – Zend_AuthAutoryzacja – Zend_Acl

4 Zend_Auth Obsługa logowania użytkowników Adaptery Obsługa konkretnej usługi uwierzytelniania Baza danych, LDAP, plik z listą użytkowników

5 Wzorzec Singleton Zend_Auth::getInstance() Dostęp do obiektu Zend_Auth Zend_Auth::getInstance()->hasIdenity() Sprawdzenie, czy użytkownik jest zalogowany

6  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']);

7  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);

8 $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'; }

9  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

10 $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);

11  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"

12 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... }

13 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ę... }

14 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'); } } }

15  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

16 $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);