#1 17. 11. 2009 20:39

jtousek
Člen
Registrovaný: 17. 11. 2009
Příspěvky: 58
Web

pár nejasností

Ahoj,

mám dojem, že mi něco podstatného uniklo, ale je tu pár věcí ohledně autentizace, které mi nejsou jasné.

  1. 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?

  1. 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)

Offline

 

#2 17. 11. 2009 21:13

Panda
Nette guru
Místo: Děčín 32
Registrovaný: 4. 7. 2008
Příspěvky: 386

Re: pár nejasností

  1. Ne, authenticate volat jen při přihlášení.
  2. 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.

Pomůžeš-li jednomu člověku, pomůžeš tím celému světu.
– Talmud

Offline

 

#3 17. 11. 2009 22:11

jtousek
Člen
Registrovaný: 17. 11. 2009
Příspěvky: 58
Web

Re: pár nejasností

Panda napsal(a):

  1. Ne, authenticate volat jen při přihlášení.
  2. 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)

Offline

 

#4 17. 11. 2009 23:49

Tomik
Nette Evangelist
Místo: Roztoky
Registrovaný: 20. 3. 2005
Příspěvky: 565
Web

Re: pár nejasností

jtousek napsal(a):

  1. 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().

  1. 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é? :)

Offline

 

#5 18. 11. 2009 0:10

jtousek
Člen
Registrovaný: 17. 11. 2009
Příspěvky: 58
Web

Re: pár nejasností

Jo, jasné. Díky. :) Nedošlo mi, že musí jít o stejného uživatele takže to má logiku.

Offline

 

#6 18. 11. 2009 1:13

Tomik
Nette Evangelist
Místo: Roztoky
Registrovaný: 20. 3. 2005
Příspěvky: 565
Web

Re: pár nejasností

jtousek napsal(a):

Jo, jasné. Díky. :) Nedošlo mi, že musí jít o stejného uživatele takže to má logiku.

Ok. Kdybys měl jakýkoli další dotaz, poděl se o něj. :)

Offline

 

#7 18. 11. 2009 7:29

jtousek
Člen
Registrovaný: 17. 11. 2009
Příspěvky: 58
Web

Re: pár nejasností

Tomik napsal(a):

Ok. Kdybys měl jakýkoli další dotaz, poděl se o něj. :)

Těch ještě bude… :-D

Offline

 

Zápatí