Byla vydána verze 11.0.0 vizuálního programovacího jazyka Snap! (Wikipedie) inspirovaného jazykem Scratch (Wikipedie). Přehled novinek na GitHubu.
Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma. Vypíchnout lze, že v Plasmě byl implementován 22letý požadavek. Historie schránky nově umožňuje ohvězdičkovat vybrané položky a mít k ním trvalý a snadný přístup.
Wayfire, kompozitní správce oken běžící nad Waylandem a využívající wlroots, byl vydán ve verzi 0.10.0. Zdrojové kódy jsou k dispozici na GitHubu. Videoukázky na YouTube.
Před necelými čtyřmi měsíci byl Steven Deobald jmenován novým výkonným ředitelem GNOME Foundation. Včera skončil, protože "nebyl pro tuto roli v tento čas ten pravý".
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 156 (pdf).
Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 25.8.1. Přehled novinek v Changelogu.
Včera večer měl na YouTube premiéru dokumentární film Python: The Documentary | An origin story.
Společnost comma.ai po třech letech od vydání verze 0.9 vydala novou verzi 0.10 open source pokročilého asistenčního systému pro řidiče openpilot (Wikipedie). Zdrojové kódy jsou k dispozici na GitHubu.
Ubuntu nově pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 4. snapshot Ubuntu 25.10 (Questing Quokka).
Řada vestavěných počítačových desek a vývojových platforem NVIDIA Jetson se rozrostla o NVIDIA Jetson Thor. Ve srovnání se svým předchůdcem NVIDIA Jetson Orin nabízí 7,5krát vyšší výpočetní výkon umělé inteligence a 3,5krát vyšší energetickou účinnost. Softwarový stack NVIDIA JetPack 7 je založen na Ubuntu 24.04 LTS.
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();