pár nejasností
- jtousek
- Člen | 951
Ahoj,
mám dojem, že mi něco podstatného uniklo, ale je tu pár věcí ohledně autentizace, které mi nejsou jasné.
- Měl bych někde třeba v bootstrapu mít něco jako tohle?
<?php
//...
$user = Environment::getUser();
$session = Environment::getSession();
$user->authenticate($session->user, $session->password);
//...
?>
Tj. měla by se metoda authenticate volat vždy? Z toho co jsem četl myslím, že ne – $user->authenticate(…) je zjevně jen pro přihlášení samotné tj. odeslání přihlašovacího formuláře. Jenže podle čeho potom zjistím, zda uživatel v databázi stále existuje a nebyl mezitím např. smazán adminem?
- K čemu je dobré zachovávat po odhlášení identitu? V dokumentaci je jako příklad uveden košík e-shopu, ale když se uživatel znovu přihlásí, stejně dojde ke smazání původní identity takže informace o košíku se ztratí – nebo ne?
Editoval jtousek (17. 11. 2009 20:42)
- Panda
- Člen | 569
- Ne,
authenticate
volat jen při přihlášení. - Vytváření identity může plně řídit
IAuthenticator
, takže se klidně může vzít současná identita a jen v ní provést nějaké změny. Osobně si použití zachování identity představuji jako takovou náhradu věcí, co bych jinak řešil porůznu cookiečky a tak – i po „odhlášení“ si například e-shop bude pamatovat mé jméno, moje nastavení měn a jazyka, moje oblíbené produkty, kategorie a další věci, ale pokud budu chtít provést nějakou vážnější akci (potvrdit objednávku, změnit heslo, …), tak se budu muset přihlásit.
- jtousek
- Člen | 951
Panda napsal(a):
- Ne,
authenticate
volat jen při přihlášení.- Vytváření identity může plně řídit
IAuthenticator
, takže se klidně může vzít současná identita a jen v ní provést nějaké změny. Osobně si použití zachování identity představuji jako takovou náhradu věcí, co bych jinak řešil porůznu cookiečky a tak – i po „odhlášení“ si například e-shop bude pamatovat mé jméno, moje nastavení měn a jazyka, moje oblíbené produkty, kategorie a další věci, ale pokud budu chtít provést nějakou vážnější akci (potvrdit objednávku, změnit heslo, …), tak se budu muset přihlásit.
Když zavolám $user->authenticate(…) tak se zavolá
$this->signOut(TRUE); což v metodě signOut vede
k $this->setIdentity(NULL); což identitu vymaže – takže nevidím
možnost jak identitu zachovat, leda nevolat $user->authenticate(…) ale
$user->getAuthenticationHandler()->authenticate(array(…)); což vede
k tomu, že se nezavolá $this->setAuthenticated(TRUE); a musím to udělat
ručně atd…
Proč se vlastně ta identita v $user->authenticate(…) maže??
Jak tu identitu tedy zachovat? Tudy cesta zdá se nevede…
EDIT: Teď mě napadá ukládat třeba ten košík do session separátně – tím si jej zachovám, ale na co v tom případě je možnost zachování identity při odhlášení když se při přihlášení stejně smaže?
Editoval jtousek (17. 11. 2009 22:20)
- Tomik
- Nette Evangelist | 485
jtousek napsal(a):
- Měl bych někde třeba v bootstrapu mít něco jako tohle?
Authenticate
se volá je při přihlášení uživatele, po
zpracování formuláře. Dále si Nette již pamatuje, kdo je přihlášen,
stačí pouze kontrolovat, zda $user->isAllowed()
.
- K čemu je dobré zachovávat po odhlášení identitu? V dokumentaci je jako příklad uveden košík e-shopu, ale když se uživatel znovu přihlásí, stejně dojde ke smazání původní identity takže informace o košíku se ztratí – nebo ne?
Při přihlášení dochází k přepsání identity. Např. mám e-shop.
Přihlásí se Franta Novák, v práci, běžně se stává, že si zákazník
vybírá nákup déle, produkty vybírá do konce pracovní doby, nestihne to
udělat všechno, odchází tedy domů. Potom přijde druhý den, ale protože
má e-shop ochranný mechanismus, že po 20 minutách odhlašuje, pokud by se
nezachovala část identity (košík), pak by o něj přišel. Nyní se tedy
přihlásí, systém ještě předtím, než zavolá authenticate
,
se koukne, zda identita minule přihlášeného uživatele je ten samý
uživatel, co se přihlašuje, pokud ano, někam si informace o košíku
(části jeho identity) zapíše, zavolá Authenticate
(to identitu
přepíše, tj. vytvoří ji znovu), a potom, pokud se přihlašuje uživatel,
u kterého byla zachována identita, tu část identity, kterou si zachoval
připíše nově přihlášenému užiaveteli.
To má za následek, že pokud druhý den do práce přijde opět Franta a přihlásí se, může pokračovat v nákupu (dokonce v něm může pokračovat i bez přihlášení a přihlásit se bude muset až na dokončení nákupu), pokud ale druhý den přijde Pepa a přihlásí se, protože on žádné objednávky nedělal bude mít košík prázdný. Dává to takhle smysl?
Uvedu ještě pseudo-kód:
<?php
/**
* Handler for login form
*
* @param AppForm $form
* @return void
*/
public function login(AppForm $form)
{
$values = $form->values;
try {
$user = Environment::getUser();
$basket = array();
if ($user->identity->usename == $values['name']) {
$backet = $user->identity->backet;
}
$user->authenticate($values['name'], $values['password']);
$user->identity->backet = $backet;
$user->setExpiration(3600, true, true);
$this->redirect('this');
} catch (AuthenticationException $e) {
$form->addError('Špatné jméno nebo heslo!');
$this->invalidateControl('login');
}
}
?>
Jasné? :)