abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 13:22 | IT novinky

    Nájemný botnet Aisuru prolomil další "rekord". DDoS útok na Cloudflare dosáhl 29,7 Tbps. Aisuru je tvořený až čtyřmi miliony kompromitovaných zařízení.

    Ladislav Hagara | Komentářů: 0
    dnes 12:11 | Nová verze

    Iced, tj. multiplatformní GUI knihovna pro Rust, byla vydána ve verzi 0.14.0.

    Ladislav Hagara | Komentářů: 2
    dnes 05:22 | Komunita

    FEX, tj. open source emulátor umožňující spouštět aplikace pro x86 a x86_64 na architektuře ARM64, byl vydán ve verzi 2512. Před pár dny FEX oslavil sedmé narozeniny. Hlavní vývojář FEXu Ryan Houdek v oznámení poděkoval společnosti Valve za podporu. Pierre-Loup Griffais z Valve, jeden z architektů stojících za SteamOS a Steam Deckem, v rozhovoru pro The Verge potvrdil, že FEX je od svého vzniku sponzorován společností Valve.

    Ladislav Hagara | Komentářů: 0
    dnes 03:22 | Nová verze

    Byla vydána nová verze 2.24 svobodného video editoru Flowblade (GitHub, Wikipedie). Přehled novinek v poznámkách k vydání. Videoukázky funkcí Flowblade na Vimeu. Instalovat lze také z Flathubu.

    Ladislav Hagara | Komentářů: 0
    včera 15:11 | IT novinky

    Společnost Proton AG stojící za Proton Mailem a dalšími službami přidala do svého portfolia online tabulky Proton Sheets v Proton Drive.

    Ladislav Hagara | Komentářů: 1
    6.12. 15:55 | Komunita

    O víkendu (15:00 až 23:00) probíha EmacsConf 2025, tj. online konference vývojářů a uživatelů editoru GNU Emacs. Sledovat ji lze na stránkách konference. Záznamy budou k dispozici přímo z programu.

    Ladislav Hagara | Komentářů: 0
    6.12. 15:44 | Komunita

    Provozovatel internetové encyklopedie Wikipedia jedná s velkými technologickými firmami o uzavření dohod podobných té, kterou má s Googlem. Snaží se tak zpeněžit rostoucí závislost firem zabývajících se umělou inteligencí (AI) na svém obsahu. Firmy využívají volně dostupná data z Wikipedie k trénování jazykových modelů, což zvyšuje náklady, které musí nezisková organizace provozující Wikipedii sama nést. Automatické programy

    … více »
    Ladislav Hagara | Komentářů: 28
    6.12. 15:22 | IT novinky

    Evropská komise obvinila síť 𝕏 z porušení unijních pravidel, konkrétně nařízení Evropské unie o digitálních službách (DSA). Vyměřila jí za to pokutu 120 milionů eur (2,9 miliardy Kč). Pokuta je podle názoru amerického ministra zahraničí útokem zahraničních vlád na americký lid. K pokutě se vyjádřil i americký viceprezident: „EU by měla podporovat svobodu projevu, a ne útočit na americké společnosti kvůli nesmyslům“.

    Ladislav Hagara | Komentářů: 26
    5.12. 17:11 | IT novinky

    Společnost Jolla spustila kampaň na podporu svého nového telefonu Jolla Phone se Sailfish OS. Dodání je plánováno na první polovinu příštího roku. Pokud bude alespoň 2 000 zájemců. Záloha na telefon je 99 €. Cena telefonu v rámci kampaně je 499 €.

    Ladislav Hagara | Komentářů: 30
    5.12. 15:11 | IT novinky

    Netflix kupuje Warner Bros. včetně jejích filmových a televizních studií HBO Max a HBO. Za 72 miliard dolarů (asi 1,5 bilionu korun).

    Ladislav Hagara | Komentářů: 2
    Jaké řešení používáte k vývoji / práci?
     (34%)
     (48%)
     (19%)
     (17%)
     (22%)
     (15%)
     (24%)
     (16%)
     (18%)
    Celkem 440 hlasů
     Komentářů: 18, poslední 2.12. 18:34
    Rozcestník

    Zend framework VII

    3.5.2008 12:46 | Přečteno: 3347× | Výběrový blog

    Zend framework - autorizace

    Minule jsem stručně popsal autentizaci, dnes, opět krátce, o autorizaci. Autorizace je v Zendu řešena přes Access Controll List (ACL). Je to v podstatě seznam zdrojů (objekt, vůči němuž se kontroluje oprávnění k přístupu), rolí (objekty, které žádají o přístup ke zdrojům) a pravidel definovaných mezi nimi. ACL je v Zendu reprezentován třídou Zend_Acl, která obsahuje metody pro přidávání zdrojů, rolí, pravidel přístupu a dotazování se na oprávněnost přístupu. Role i zdroje mohou být jak existující objekty, tak objekty, které v systému reálně neexistují (jak bylo řečeno, ACL je seznam nějakých rolí a zdrojů a vztahů mezi nimi, bez jakéhokoli zřetele ne realitu; co si nadefinujeme, to máme).

    Prvně tedy musíme definovat zdroje a role, které v systému budou vystupovat. Uvažujme jednoduchý příklad, kdy budeme mít např. školní systém pro zadávání a zobrazování známek. Budeme v systému mít následující role: studen (student), rodiče (parents), učitel (teacher) a administrátor (admin). Zdroje budou reprezentovat jednotlivé případy použití (use case), které budou odpovídat jednotlivým kontrolerům (k jednomu use case jeden kontroler). Každý případ užití bude mít jednu nebo více akcí:

    Oprávnění budou následující: student bude mít právo volat akci pro zobrazení známek. Rodič může zobrazit známky studenta a vzkazy, učitel může krom zobrazování známek a vzkazů volat akce pro zadávání známek a vzkazů a dále přidávat nebo odebírat žáka a jeho rodiče. Administrátor bude mít neomezený přístup ke všem use case a jejím akcím (tj. může navíc např. přidávat a odebírat učitele).

    Vytvoříme tedy instanci Zend_Acl. Přidání rolí je jednoduché a stejně tak přidání zdrojů :

      $_acl = new Zend_Acl();
    
      $_acl->add(new Zend_Acl_Resource('marks'));
      $_acl->add(new Zend_Acl_Resource('messages'));
      $_acl->add(new Zend_Acl_Resource('studentlist'));
      $_acl->add(new Zend_Acl_Resource('teacherlist'));
    
      $_acl->addRole(new Zend_Acl_Role('guest'));
      $_acl->addRole(new Zend_Acl_Role('student'));
      $_acl->addRole(new Zend_Acl_Role('parents'), 'student');
      $_acl->addRole(new Zend_Acl_Role('teacher'), 'parents');
      $_acl->addRole(new Zend_Acl_Role('admin'));
    
    Definovali jsme čtyři zdroje, v našem případě kontrolery a čtyři role v systému (navíc jsme ještě zavedli roli hosta pro případ, že uživatel není přihlášený, ale to není nezbytně nutné). Parametr v konstruktorech je identifikátor zdroje resp. role. První parametr funkce addRole() je instance třídy Zend_Acl_Role, další parametry určují identifikátory rolí od nichž vytvářená role dědí práva. Tj. pokud není explicitně definováno pravidlo pro danou roli a zdroj, Zend prochází předky role a hledá, zda je nějaké pravidlo definováno pro předka role a zdroj. Pokud ano, je použito toto pravidlo. Předci role se prochází od posledního k prvnímu (tj. pokud bychom měli $_acl->addRole(new Zend_Acl_Role('teacher'), 'student','parents'), hledají se prvně pravidla pro zdroj a roli parents, až pokud opět žádné pravidlo není nalezeno, hledá se pravidlo pro zdroj a roli student). Použije se pravidlo, které najde jako první - na pořadí, v jakém uvádíme předky role tedy záleží.

    Definujme nyní tedy jednotlivá pravidla pro jednotlivé role a kontrolery:

      $_acl->allow('student', 'marks','show');
      $_acl->allow('parents', 'messages','show');
      $_acl->allow('teacher', 'marks','add');
      $_acl->allow('teacher', 'messages','add');
      $_acl->allow('teacher', 'studentlist');
      $_acl->allow('admin');
    
    Voláním metody allow(role,zdroj,akce) povolujeme roli s daným zdrojem provést uvedenou akci (shodou okolností je v našem případě akce akce na kontroleru, ale nemusí tomu tak být, zdroj i akce může být cokoli, nejen kontroler a akce na kontroleru). Pro zakázání bychom použili metodu deny(). Pokud uvedeme jen roli a zdroj, pak se povolí všechny akce. Pokud ale uvedeme akci (jednu nebo více), ostatní, které nebyly uvedeny v seznamu jsou automaticky zakázané. V našem případě tedy např. student má právo na kontroleru marks volat pouze akci show, pokud bychom ale definovali právo následovně $_acl->allow('student', 'marks'), měl by právo volat jak akci show, tak akci add. Pokud místo zdroje uvedeme null, pak se dané pravidlo aplikuje na všechny zdroje, tj. opět např. pro roli student by $_acl->allow('student', null,'show') znamenalo, že student může volat akci show nejen na kontroleru marks, ale také např. na kontroleru messages nebo jakémkoli jiném.U administrátora jsem nedefinovali žádný zdroj ani akci, což znamená, že má dovoleno vše.

    Máme nyní tedy definované role a zdroje v systému a nastavena pravidla (patrně to všechno dáme do jedné třídy, např. MyAcl). To vše ale zatím byly abstraktní věci, které nemuseli mít s realitou nic společného. Že zdroj bude kontroler a akce bude akce na kontroleru jsem měli jen v hlavě, framework o tom zatím nic neví. Musíme tedy implementovat třídu, kde frameworku řekneme, co je zdroj, co akce, kde má vzít roli uživatele a jak s tím vším naložit. Protože práva budeme kontrolovat pro každý požadavek, můžeme toto vše implementovat jako pulgin front controlleru.

      class ZendTest_Acl_AclPlugin extends Zend_Controller_Plugin_Abstract{
        private $_auth;
        private $_acl;
    
        private $_noacl = array('module' => 'default',
        'controller' => 'aclerror',
        'action' => 'index');
    
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            $this->_auth = Zend_Auth::getInstance();
    	$this->_acl = ZendTest_Acl_MyAcl::getAcl();
    
    	if ($this->_auth->hasIdentity()) {
    	  $role = $this->_auth->getIdentity()->getUser()->role;
    	} else {
    	  $role = 'guest';
    	}
    
    	$controller = $request->controller;
    	$action = $request->action;
    	$module = $request->module;
    	$resource = $controller;
    		
    	
    	if ($this->_acl->has($resource)){
    	  if (!$this->_acl->isAllowed($role, $resource, $action)) {
    		$module = $this->_noacl['module'];
    		$controller = $this->_noacl['controller'];
    		$action = $this->_noacl['action'];
    	  }
    	}
    
    	$request->setModuleName($module);
    	$request->setControllerName($controller);
    	$request->setActionName($action);
        }
    
      }
    
    Ve výše uvedené části kódu prvně nastavíme na jaký kontroler má být přesměrován požadavek, pokud uživatel nemá právo provést požadovanou akci na příslušném kontroleru. V metodě preDispatch() získáme identitu uživatele a z ní jeho roli (roli máme připravenou již od minula) a dále definici pravidel. Z identity uživatele zjistíme jeho roli, pokud uživatel nemá identitu, tak zřejmě není přihlášen a je obsazen do role hosta. Dále z požadavku zjistíme kontroler a akci, kterou chce uživatel zavolat. Samotná kontrola práv proběhne na zavoláním $this->_acl->isAllowed($role, $resource, $action), kde jsem ještě před tím zjistili, zda je požadovaný zdroj v acl definován. Pokud zdroj není v acl definován, má k němu automaticky přístup kdokoli. Pokud je v acl definován, proběhne ověření, zda k němu má daná role přístup a pokud ne, provede se přesměrování na kontroler uvedený na začátku pluginu.

    Toto je jen jednoduchý příklad, jak lze acl v Zendu použít. Plugin bychom pochopitelně mohli rozšířit např. tak, že pokud by uživatel nebyl přihlášený, tak by byl přesměrován na přihlašovací formulář a pod. Pokud by nám nestačil seznam povolených a zakázaných akcí, můžeme si implementovat vlastní třídu, která bude rozhodovat, zda je možno k danému zdroji přistupovat nebo ne. Ukázka je např. v manuálu Zendu, kde je to demonstrováno na přikladu, že chceme dovolit přistup jen z určitých IP adres.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    26.2.2009 18:40 gorgo | skóre: 11 | blog: denicek
    Rozbalit Rozbalit vše Re: Zend framework VII

    Prvni! =)

    Predne diky za pekny clanek, chtel bych se zeptat, jak vypada implementace funkce ZendTest_Acl_MyAcl::getAcl();
    zminena v kodu. Nejak to nemuzu najit=(

    27.2.2009 18:30 gorgo | skóre: 11 | blog: denicek
    Rozbalit Rozbalit vše Re: Zend framework VII

    tak uz dobry, poresil jsem to...

    Jestli seberu odvahu a cas, tak nekam postnu blog o ukladani celyho acl v databazi=)

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.