Authentikace a authorizace
- Petr Daňa
- Člen | 109
Zdar všem, dělali jste někdo v Nette už s authentikací a authorizací? Jak na to? Mě se to pořád nějak nedaří ze zdrojáků vyčíst. Nejspíš pomocí třídy Web::User, ale netuším, jak to používat. Instance nejspíš v bootstrapu, jestli se nepletu tak to zároveň nastartuje session. Ale jak dál? Jestli někdo máte aspoň jednoduchý funkční příklad, který by používal User v alespoň dvou presenterech (jestli stačí na pochopení, tak i v jednom :) ), byl bych velmi zavázán za jeho zveřejnění.
- Patrik Votoček
- Člen | 2221
Petr Daňa napsal(a):
Hm, klasika, když po dlouhým neúspěšným pátrání někam napíšu dotaz, tak pak na to za chvíli přijdu sám. No, takže
Environment::getUser()
je nespíš ta správná cesta. Tak jdu zkoumat dál.
Pokud příjdeš na něco srozumitelného a použitelného tak by jsi mohl napsat malý tutorialek… Taky by se me to hodilo… :-)
- Petr Daňa
- Člen | 109
Zatím si s tím jen hraju, ale myslím, že ten základ mám, tak sem hodím aspoň tohle, třeba na to navážou další (momentálně zkoumám zas něco jiného, takže jsem další pokusy s Userem odložil).
Do bootstrapu dáme následující (poznámky k danému kusu kódu jsou vždy pod ním):
$auth = new SimpleAuthenticator(array('admin' => 'admin'));
Tohle je jen dočasná (pro testování, než vytvořím vlastní Authenticator třídu spolupracující s db) tabulka uživatelů, předává se jí pole s prvky ‚user‘ ⇒ ‚heslo‘.
$user = Environment::getUser();
$user->setAuthenticationHandler($auth);
A teď už použití – Environment::getUser() je statická metoda, takže použitelná odkudkoliv. V bootstrapu nastavíme authentikační třídu (nyní ten SimpleAuthenticator, později vlastní třída implementující IAuthenticator).
try
{
$user->authenticate('admin', 'admin2');
} catch (AuthenticationException $ex)
{
switch ($ex->getCode())
{
case IAuthenticator::IDENTITY_NOT_FOUND:
break;
case IAuthenticator::INVALID_CREDENTIAL:
break;
}
}
Tohle mám kvůli testování taky v bootstrapu, ale pak to bude v daném
presenteru či komponentě pro login. Volá se metoda authenticate
(ta je ve třídě SimpleAuthenticator) předají se jí parametry user a heslo.
Je to v try bloku, protože v dané implementaci se při neznámém uživateli
či chybném hesle vyhazují výjimky.
Pak už je použití třeba v presenterech jednoduché:
$user = Environment::getUser();
$this->template->page = $user->getIdentity()->getName() ." > ". ($user->isAuthenticated() ? "true" : "false");
Do proměnné page
v šabloně uloží jméno uživatele a
příznak, zda je authentikovaný (tj. přihlášení proběhlo v pořádku
nebo ne).
Odhlášení jsem ještě nezkoušel, ale bude to myslím:
$user->signOut()
Jak jsem psal, není to nic moc popis, opravdu jen základ, ale třeba to pomůže lidem v podobné situaci jako u mě, tj. že netuší, jak to kde všechno funguje :) Nezkoušel jsem ještě práci s rolema, ale to bude taky obdobně jednoduchý (aspoň doufám :) ). Tak třeba někomu ušetřím práci (ať žije xdebug :) ).
Hm, teď si tak říkám, jestli tu neťápu moc velký blbosti, jestli jo, tak ať to David kdyžtak smaže ;)
Editoval Petr Daňa (24. 4. 2008 15:24)
- David Grudl
- Nette Core | 8218
getName
definuje interface IIdentity
,
v příkladě konkrétně třída Identity
. Ta je velmi jednoduchá
a vlastně jen vrací proměnné $name, $roles, $data
, která se
uvedou v konstruktoru. Instanci vytváří IAuthenticator
,
v příkladu jde o třídu Users
. Zkus se podívat do
jejího kódu.
- cuga
- Člen | 210
Jod napsal(a):
Cugo, je to konkrétne následujúci riadok, keby si bol lenivý kukať sa ,)
<?php return new /*Nette\Security\*/Identity($identityName, $roles, $userData); ?>
V tvojom prípade je zaujímavý práve ten prvý argument.
Diky moc za nakopnuti, uz to beha. Akorat to chtelo upravit ten zdrojak na:
<?php
return new /*Nette\Security\*/Identity($row['full_name'], array(), $row);
?>
Nejsem jeste v objektovem phpku az tak kovany, ale muzete me nekdo
nakopnout, jestli melo fungovat $row->full_name (proto
$row['full_name']
, protoze u me v tom akrabatu nefungovalo ani
$row->password
pro overovani hesla.
A jeste jeden dotaz… kde se v tride Users urcuje z ktere db tabulky ma dibi tahat data??? Nebo musi byt jmeno db tabulky shodne s jmenem tridy???
Editoval cuga (23. 10. 2008 15:47)
- David Grudl
- Nette Core | 8218
Ano, pokud se nestanoví jinak, odvodí se název tabulky z názvu třídy, viz Experiment DibiTable.
V jedné z posledních verzí dibi funguje $row->full_name
i $row['full_name']
zároveň.
- cuga
- Člen | 210
David Grudl napsal(a):
Ano, pokud se nestanoví jinak, odvodí se název tabulky z názvu třídy, viz Experiment DibiTable.
V jedné z posledních verzí dibi funguje
$row->full_name
i$row['full_name']
zároveň.
aaaaaaaha, tak to uz vysvetluje mnohe :) sem mel verzi dibi starou jak metuzalem :)