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,
authenticatevolat 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,
authenticatevolat 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é? :)