Odhlášení a přihlášení v jednom kroku
- Paimutan
- Člen | 33
Ahojte,
chci mít na webu funkcionalitu, že po odeslání formuláře (s uživatelskými údaji) tyto údaje u uživatele aktualizuju (v db), odhlásím ho a hned opět přihlásím, aby se jeho údaje hned projevily i na webu.
Mám tu ale problém s tím, že když uživatele odhlásím & přihlásím, tak nové přihlášení platí jen v aktuální requestu, po refreshi už ne.
# METODA, KTERA ZPRACOVAVA ODESLANI FORMULARE PRO ZMENU UDAJU:
// Odhlaseni probehne
if($this->getUser()->isLoggedIn())
$this->getUser()->logout(true);
// identity->getData() vraci prazdnotu, OK.
// Prihlasi
$this->getUser()->login($uzivatel, $heslo);
// identity->getData() vraci aktualne zaslane hodnoty, ok
// V tuto chvili je uzivatel prihlasen, udaje na webu jsou aktualni.
// Prihlaseni bohuzel ale plati pouze ted, v dalsim requestu zmizi.
Takže po odeslání formuláře je uživatel přihlášen, ale jakmile ho přesměruju (což potřebuju), nebo třeba sám provede další request na stránku, tak už si to to nové přihlášení nepamatuje a je odhlášen.
Toto přihlášení se děje na konci metody pro zpracování uvedeného
formuláře. Pak už je jen redirect.
Stejně tak to mám v metodě zpracovávající formulář pro přihlášení.
Stejný getUser()->login() kód, stejně tak hned potom přesměrovávám.
Takže nechápu, proč si v tomto případě Nette nezapamatuje, že
v minulém requestu uživatele přihlásilo.
Nette2.0.11 @ PHP 5.3
Editoval Paimutan (27. 8. 2013 15:10)
- David Matějka
- Moderator | 6445
jestli to je opravdu jen kvuli aktualizaci udaju, tak je lepsi upravit identitu, treba takto:
$newData = $form->values;
foreach($newData as $key=>$value) {
$this->user->identity->$key = $value;
}
nebo lepe – udelat si vlastni identitu (implementujici Nette\Security\IIdentity), ktera bude ukladat do session jen ID a upravit si userstorage, aby vzdy nahral aktualni identitu, viz treba zde: https://forum.nette.org/…dem-pristupu#…
ma to vyhodu, ze to reaguje i kdyz ty udaje zmeni nekdo jiny (treba admin, treba muzes chtit uzivatele zablokovat atd.), tak mas vzdy aktualni identitu
- Paimutan
- Člen | 33
EDIT: funguje, ale jen částečně. Hodnota klíče id se mi nedaří změnit.
// Pokus 1
$this->getUser()->identity->id = 123;
// Pokus 2
$this->getUser()->identity->__set('id', 123);
// Pokus 3
$this->getUser()->identity->setId(123);
// Pokus 4
$this->getUser()->getIdentity()->id = 123;
// Pokus 5
$this->getUser()->getIdentity()->__set('id', 123);
// Pokus 6
$this->getUser()->getIdentity()->setId(123);
// Jina pole to ale zmeni s prehledem
$this->getUser()->identity->email = 'nejaky@email'
print_r($this->getUser()->getIdentity()); // Nove id se zde vubec neprojevi, email ano
Id to tedy vůbec nezmění, kdežto např. email ano.
Bug? Nebo to dělám špatně? Google nepomohl :\
- MartinitCZ
- Člen | 580
@**Paimutan**: Počítá se stím, že ID je v DB jako AI, tzv.
databáze si id určí sama a ty ho nebudeš měnit.
Z principu bys ani neměl, jelikož tim zasáhneš do celé strukury databáze,
resp. dat.
- Paimutan
- Člen | 33
martinit napsal(a):
@**Paimutan**: Počítá se stím, že ID je v DB jako AI, tzv. databáze si id určí sama a ty ho nebudeš měnit.
Z principu bys ani neměl, jelikož tim zasáhneš do celé strukury databáze, resp. dat.
Já ho sám neměním. Tento pokus o přiřazení ID do identity se děje ve chvíli, kdy zaregistruju uživatele a ve stejném kroku ho potřebuju přihlásit. TO id, které nastavuju, mi tedy vrátila databáze. Já potřebuji toto nové id ihned promítnout do aktuální identity, aby byl přihlášen uživatel pod novým id.
- PavelJurasek
- Člen | 39
Metoda Nette\Security\User::login()
přijimá i instanci
Nette\Security\IIdentity
, tu můžeš sestavit po
registraci ručně.
- Paimutan
- Člen | 33
pavelJurasek: to se ale vracíme zpět k původnímu problému – že mi to nechce v tom jednom kroku uživatele odhlásit a zároveň hned přihlásit (jen ho to odhlásí, viz první příspěvek).
re-login vypadá takto:
$Identity = new Nette\Security\Identity($userData->id, 1, (array) $userData);
$this->getUser()->logout(true);
$this->getUser()->login($Identity);
V metodě, která zpracovává postlý formulář.