pár nejasností

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jtousek
Člen | 951
+
0
-

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)

Panda
Člen | 569
+
0
-
  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.
jtousek
Člen | 951
+
0
-

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)

Tomik
Nette Evangelist | 485
+
0
-

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

jtousek
Člen | 951
+
0
-

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

Tomik
Nette Evangelist | 485
+
0
-

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

jtousek
Člen | 951
+
0
-

Tomik napsal(a):

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

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