Přemýšlíte, jak začít prázdniny? Už v úterý 1. července se bude konat Virtuální Bastlírna, tedy online setkání bastlířů, techniků, vědců i akademiků, kde se ve volné diskuzi probírají novinky ze světa techniky, ale i jiných zajímavých témat.
Za poslední měsíc jsme byli svědky plamenů několika raket. Zatímco malá raketa od Hondy se úspěšně vznesla a opět přistála, raketa od SpaceX se rozhodla letět všemi směry najednou. Díkybohu méně … více »Linus Torvalds zmínil, že souborový systém Bcachefs zřejmě odstraní z mainline Linuxu v začleňovacím okně pro vydání 6.17. Kent Overstreet mu totiž posílá kód s novou funkcionalitou i pro začlenění do kandidátů na vydání, kdy očekává pouze opravy chyb. Ken Overstreet byl již dříve z vývoje vyloučen kvůli konfliktní komunikaci.
Ministerstvo průmyslu a obchodu propaguje Microsoft. Ten ve spolupráci s Ministerstvem průmyslu a obchodu spouští AI National Skilling Plan v ČR. "Iniciativa Microsoftu přináší konkrétní a praktickou podporu právě tam, kde ji nejvíc potřebujeme – do škol, firem i veřejné správy.", říká ministr průmyslu a obchodu Lukáš Vlček.
Jste český ISP? Vyplněním krátkého dotazníku můžete pomoci nasměrovat vývoj nové generace routerů Turris Omnia [𝕏].
Celkové tržby společnosti Canonical za rok 2024 byly 292 milionů dolarů (pdf). Za rok 2023 to bylo 251 milionů dolarů.
Byla vydána verze 1.88.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
Distribuce Tails specializující se ochranu online soukromí uživatele byla vydána ve verzi 6.17. Mimo jiné aktualizuje Tor Browser (14.5.4) a opravuje několik chyb.
Ubuntu nově pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 2. snapshot Ubuntu 25.10 (Questing Quokka).
Město Lyon posiluje svou digitální suverenitu a postupně nahrazuje software od společnosti Microsoft bezplatnými alternativami, zejména OnlyOffice pro kancelářské aplikace a Linux a PostgreSQL pro systémy a databáze.
Evropská občanská iniciativa Stop Destroying Videogames se snaží o to, aby vydavatelé, kteří spotřebitelům v Evropské unii prodávají videohry nebo na ně udělují licence, měli povinnost tyto hry ponechat ve funkčním (hratelném) stavu i po ukončení podpory ze své strany. Podpořit podpisem tuto iniciativu můžete v Systému pro online sběr podpisů.
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();