Google na své vývojářské konferenci Google I/O 2024 představil řadu novinek. Keynote byl věnován umělé inteligenci (DeepMind, Gemini, Responsible AI).
V Gitu bylo nalezeno 5 zranitelností. Opraveny jsou ve verzích 2.45.1, 2.44.1, 2.43.4, 2.42.2, 2.41.1, 2.40.2 a 2.39.4. Útočník může připravit repozitář tak, že při jeho klonování (git clone) může dojít ke spuštění libovolného kódu.
Virtualizační softwary VMware Workstation Pro a VMware Fusion Pro jsou nově pro osobní použití zdarma. Softwary VMware Workstation Player a VMware Fusion Player končí.
Linuxová distribuce Endless OS (Wikipedie) byla vydána ve verzi 6.0.0. Přehled novinek i s náhledy v příspěvku na blogu, poznámkách k vydání a také na YouTube.
Byl vydán Mozilla Firefox 126.0. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Vylepšena byla funkce "Zkopírovat odkaz bez sledovacích prvků". Přidána byla podpora zstd (Zstandard). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 126 je již k dispozici také na Flathubu a Snapcraftu.
Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 11.0. Přehled novinek v aktualizované dokumentaci.
Byla vydána nová verze 24.0 linuxové distribuce Manjaro (Wikipedie). Její kódové jméno je Wynsdey. Ke stažení je v edicích GNOME, KDE PLASMA a XFCE.
Byla představena oficiální rozšiřující deska Raspberry Pi M.2 HAT+ pro připojování M.2 periferii jako jsou NVMe disky a AI akcelerátory k Raspberry Pi 5. Cena je 12 dolarů.
V Praze o víkendu proběhla bastlířská událost roku - výstava Maker Fair v Praze. I strahovští bastlíři nelenili a bastly ostatních prozkoumali. Přijďte si proto i vy na Virtuální Bastlírnu popovídat, co Vás nejvíce zaujalo a jaké projekty jste si přinesli! Samozřejmě, nejen českou bastlířskou scénou je člověk živ - takže co se stalo ve světě a o čem mohou strahováci něco říct? Smutnou zprávou může být to, že provozovatel Sigfoxu jde do
… více »Kam asi vede IllllIllIIl.llIlI.lI? Zkracovač URL llIlI.lI.
Minule jsem vytvořil formulář pro přihlášení, ale nedodělal jsem akci, která zpracovává data z formuláře. Zatím jsem jen provedl kontrolu, zda jsou data do formuláře zadaná validní. Dnes se tedy podívám na jednu z metod, jak v Zendu provést autentizaci, a to asi nejpoužívanější - ověření uživatelem zadaného loginu a hesla oproti záznamu v databázi.
Pro účely autentizace Zend nabízí třídu Zend_Auth
. Tato třída samotná ale ke skutečnému provádění autentizace neslouží. Slouží spíše jako obalující třída pro různé úkony s autentizací spojené (krom provedení autentizace např. k uložení výsledku atd.). Autentizace samotná je prováděna autentizačními adaptéry. Adaptér musí implementovat rozhraní Zend_Auth_Adapter_Interface
, které definuje pouze jedinou metodu, a tou je metoda authenticate()
. Pro autentizaci oproti záznamu v databázi je v Zendu již připraven adaptér Zend_Auth_Adapter_DbTable
(dále jsou dostupné adaptéry pro autentizaci přes Ldap, OpenId a další). Adaptéru nastavíme atributy potřebné pro úspěšné provedené autentizace daným způsobem (např. v jaké tabulce databáze je login a heslo) a zavoláme metodu authenticate()
. Ta jako výsledek vrátí (i neúspěšném případě) výsledek reprezentovaný třídou Zend_Auth_Result
. Tento výsledek pak můžeme uložit a později opět získat pomocí třídy Zend_Auth
. Pokud neurčíme jinak, bude Zend_Auth
výsledek ukládat do session. Jelikož Zend_Auth
je singleton, její instanci lze získat pouze přes statickou metodu Zend_Auth::getInstance()
.
Vše asi bude srozumitelnější z příkladu. Předpokládejme, že máme v databázi následující tabulku, kde je krom loginu a hesla navíc uložena informace, zda je účet aktivní a navíc uživatelova role (tu pak využijeme při autorizaci):
CREATE TABLE userlogin(login_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,login VARCHAR(255) UNIQUE NOT NULL, passwd VARCHAR(32) NOT NULL, active BOOLEAN NOT NULL, role VARCHAR(10) NOT NULL);Z registrů získáme v nich uložené spojení do databáze a vytvoříme instanci
Zend_Auth_Adapter_DbTable
:
$db = Zend_Registry::get('db'); $authAdapter = new Zend_Auth_Adapter_DbTable($db);Na adaptéru nastavíme tabulku, kde jsou uloženy autentizační údaje a jméno sloupečku v tabulce, kde je login a kde heslo:
$authAdapter->setTableName('userlogin'); $authAdapter->setIdentityColumn('login'); $authAdapter->setCredentialColumn('passwd'); $authAdapter->setCredentialTreatment('MD5(?) AND active = 1');Poslední řádek určuje, jak se má zacházet s heslem (v našem případě získat MD5 hesla, neboť v databázi je uloženo jen MD5 hesla) a další dodatečnou podmínku, aby byla autentizace úspěšná (zde je dodatečná podmínka, že účet musí být aktivní). Nyní ještě musíme nastavit pro jaká data chceme autentizaci provádět:
$authAdapter->setIdentity($username); $authAdapter->setCredential($passwd);a můžeme zavolat
authenticate()
, a to jak již bylo řečeno, přímo na adaptéru nebo na instaci Zend_Auth
:
$auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter);Jestli byl pokus o autentizaci úspěšný, zjistíme zavoláním metody
isValid()
na objektu $result
(instance Zend_Auth_Result
).
Jestliže voláme metodu authenticate()
výše uvedeným způsobem (tj. na instanci Zend_Auth
), Zend_Auth
krom zavolání metody authenticate()
na adaptéru uloží v případě úspěšné autentizace identitu uživatele do session.
Identitu můžeme získat i z objektu $result
zavoláním metody getIdentity()
a nebo (to je asi nejčastější a nejdůležitější způsob) přes Zend_Auth
opět voláním metody getIdentity()
(ještě před tím můžeme ověřit, že identita existuje zavoláním metody hasIdentity()
). Tj. kdekoli v aplikaci můžeme ověrit, zda je uživatel přihlášen, a jestliže ano, tak se podívat, co je to za uživatele:
$auth = Zend_Auth::getInstance(); if ($auth->hasIdentity()) { $identity = $auth->getIdentity(); }Identita obsahuje jen login uživatele. Pokud bychom chtěli, aby obsahovala i další údaje, můžeme do ní z login tabulky načíst i další údaje, slouží k tomu metoda
getResultRowObject()
:
$data = $authAdapter->getResultRowObject(null,array('passwd','active')); $auth->getStorage()->write($data);Zde jsem načetli z tabulku celou řádku až na heslo, které je zbytečné (ba dokonce nebezpečné) v session ukládat a stejně tak je dál zbytečný atribut active. Metoda
getResultRowObject()
má dva parametry. První parametr metody getResultRowObject()
je pole obsahující názvy sloupců tabulky, které chceme získat (pokud je null
, berou se všechny) a druhý pole s názvy sloupců, které chceme vynechat (pokud první parametr nebude null
, pak se již na druhý argument nebere zřetel). Nyní tedy máme v případe úspěšné autentizace uživatele v session uložen jeho login, id a roli. Roli příště využijeme pro autorizaci.
Pokud se uživatel odhlásí, patrně by bylo dobré vymazat jeho identitu. To se snadno zařídí následujícím způsobem:
Zend_Auth::getInstance()->clearIdentity();Celá akce pro přihlášení, minule nedodělaná, by tedy mohla vypadat třeba takto:
public function authAction(){ if (!$this->getRequest()->isPost()) { return $this->_forward('index'); } $form = $this->getLoginForm(); if (!$form->isValid($_POST)) { $this->view->form = $form; return $this->render('showform'); } $db = Zend_Registry::get('db'); $authAdapter = new Zend_Auth_Adapter_DbTable($db); $authAdapter->setTableName('userlogin'); $authAdapter->setIdentityColumn('login'); $authAdapter->setCredentialColumn('passwd'); $authAdapter->setCredentialTreatment('MD5(?) AND active = 1'); $authAdapter->setIdentity($username); $authAdapter->setCredential($passwd); $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { $data = $authAdapter->getResultRowObject(null,array('passwd','active')); $auth->getStorage()->write($data); $this->_redirect('/loginNeeded'); } else { $this->view->message = 'Login failed.'; } }A pro úplnost ještě akce pro odhlášení:
function logoutAction(){ Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/login'); }
Tiskni Sdílej:
$prihlaseny = Zend_Auth::getIdentity();