Přihlášení vydrží pouze redirect z přihlašovacího formuláře
- Lawondyss
- Člen | 106
Zdravím.
Po přihlášení mám problém s udržením identity přihlášeného
uživatele.
Nastavenou expirace uživatele:
public function submittedSignInForm(EForm $form)
{
$values = $form->getValues();
$this->member->setExpiration('+ 30 minutes', TRUE);
try
{
$this->member->login($values['login'], $values['heslo']);
$this->redirect('Info:');
}
catch(AuthenticationException $e)
{
$form->addError($e->getMessage());
}
}
Nastavení expirace session v bootstrapu:
$session = Environment::getSession();
$session->setExpiration('+ 7 days');
$session->setSavePath(TEMP_DIR.'/sessions/');
$session->start();
Když se po přihlášení kouknu do souboru se session, jsou tam veškerá data v pořádku. Dám obnovit stránku nebo kliknu na odkaz a data o uživateli ze session zmizí.
Používám uvolněnou alfaverzi 2.0
- Jan Tvrdík
- Nette guru | 2595
- Projevuje se chyba ve všech prohlížečích?
- Když si prohlídneš nějakým nástrojem cookie se session ID, je v pořádku?
- Zkus zakomentovat
$session->setSavePath(...)
.
- Šolim
- Člen | 20
Chyba se skutečně projevuje ve všech prohlížečích.
Session ID je uložené v cookies s názvem PHPSESSID? V ní je jak před
zalogováním tak po zalogování stejná hodnota.
$session->setSavePath(…) tam vůbec nikde nemám… používám jako
základní kostru webu sandbox nejnovějšího nette:
NetteFramework-2.0.8-PHP5.3
Authenticátor používám v defaultním nastavení. Zalogování proběhne správě… po jakékoliv přesměrování (kliknutí na odkaz, $this->redirect();, submit form) dochází ke ztrátě identity.
//edit
ještě bych měl dodat, že u mě na localu vše funguje jak má,… problém
se vyskytuje na ostrém hostingu, možná je problém někde v nějakém jeho
nastavení… ale nevím v jakém
Editoval Šolim (23. 2. 2013 14:36)
- petr.pavel
- Člen | 535
Vypadá to, že se ti data session z nějakého důvodu neuloží. Budeš muset zjistit, kam se na tvém serveru ukládají, a podívat se, co se tam děje. Kam se ukládají, zjistíš nejlépe přes phpinfo() v části Session / session.save_path.
Osobně bych úložiště nastavoval, abych měl všechna data od Nette pohromadě a ne v nějakém adresáři, kam by se s trochou smůly mohl dostat i jiný uživatel.
Cestu nastavuji raději v config.neon než v bootstrap.php přes setSavePath().
php:
#session.save_path: "%tempDir%/sessions"
nette:
session:
savePath: '%tempDir%/sessions' # stejné jako session.save_path nahoře v php
- Šolim
- Člen | 20
Díky za odpověd.
No session jako také mam odzkoušené, že fungují… ukládají se prý do
defaultního adresáře. Neboť nemají natavenou žádnou cestu. Přikládám
phpinfo:
http://physics.mff.cuni.cz/…/phpinfo.php
savePath jsem nastavil v configu, jak píšeš, a nyní se mi ve složce /tmp/session generují sessions soubory
nicméně identita uživatele se mi stále strácí
Editoval Šolim (23. 2. 2013 19:01)
- enumag
- Člen | 2118
- Ta sušenka (cookie) PHPSESSID zůstane i poté se identita ztratí?
- Je v adresáři sessions vytvořen soubor s názvem odpovídajícím hodnotě toho cookie?
- Můžeš se v debugbaru podívat na obsah session? (V Nette na to sice je panel, ale tenhle je lepší.)
- Jsi si jistý že někde omylem nevoláš logout po tom přesměrování?
To je tak vše co mne v tuto chvíli napadá. ;-)
- Šolim
- Člen | 20
v PHPSESSID zústává pořád.
V adresáři session je skutečně soubor s názvem odpovídající hodnotě
cookies PHPSESSID
Ten debugbaruse mi nedaří rozeběhnout. Hlásí to:
Found sections ‚extensions‘ in configuration, but corresponding extensions
are missing.
Asi se ještě musí něco přidat do boostrapu.php odpovídající
extensions… ale nepodařilo se mi najít jaké
To už mi napadlo hodně dávno… zda se nějakým způsobem nevolá logout :)… ale bohužel ani tohle to nedělá.
Editoval Šolim (23. 2. 2013 20:45)
- enumag
- Člen | 2118
Jo on ten session panel vyžaduje Nette 2.1, zapomněl jsem na to. Srry. :-/ Pro 2.0 existuje addon, ale je tam ještě jiná nekompatibilita. Zkus ten jednoduchý session panel co je v Nette.
Dále si zkontroluj že nikde do session neukládáš objekty – na těch to může snadno selhat pokud nejdou serializovat aniž by to zahlásilo chybu. Jednou jsem takhle do session omylem ukládal ActiveRow a divil se že to neběhá.
- Šolim
- Člen | 20
Je to zvláštní… Ten panýlek na session se mi už podařilo rozeběhnout. Obsahuje přesně to co bych očekával. Všechny hodnoty session se v něm udržují přesně jak mají kromě té, která obsahuje identitu uživatele… ta se udrží je po prvotním přihlášení… po jakékoliv následujícím redirectu se smaže.
Do session objekty neukládám…
Chápu, že tenhle problém… je jen těžko uvěřitelný… ale je tomu skutečně tak… nějaký další nápad? :)
- enumag
- Člen | 2118
Hmm… je to long-shot ale zkusil bych porovnat hodnoty session direktiv v phpinfo s těmi z localhostu jestli tam nebude něco podezřelého.
Už mi ale nějak docházejí nápady. :-( Zkus se zeptat admina serveru jestli ho nenapadá nějaký důvod. Jinak mi asi nezbývá než ti popřát pevné nervy. ;-)
EDIT: Počkej… nepoužíváš náhodou nějakou vlastní třídu Identity? Pokud ano, od čeho ji dědíš?
Editoval enumag (23. 2. 2013 21:59)
- Šolim
- Člen | 20
Dump identity ihned po přihlášení:
dump(\Nette\Environment::getUser()->getIdentity());
Nette\Security\Identity(4) {
id private => 2.0
roles private => array(1) [
0 => "admin" (5)
]
data private => array(6) {
ID => 2.0
JMENO => "jméno" (6)
PRIJMENI => "příjmení" (5)
LOGIN => "admin" (5)
EMAIL => "email@email.cz" (20)
ROLE => "role" (5)
}
frozen private => FALSE
}
Já bych jsme klidně hodili odkaz na ten web i přihlašovací údaje, aby jsi to mohl lépe zkouknout… ale bojím se aby mi to tam třeba nějaký šotek tam nerozvrtal, když mi tam nefunguje to logovaní.. a cmsko je ted přístupné odkudkoliv komukoliv :). Kdyžtak jen soukromě přes email. Nicméně velmi děkuji za snahu!
- enumag
- Člen | 2118
Netuším jestli to může nějak souviset, ale proč je proboha id float? :-O Anebo se integery dumpujou takhle?
E-mail mám v profilu, ten problém mne zaujal takže bych se na to zkusil mrknout. Ale nic neslibuju. ;-)
EDIT: Ještě mne napadá, je něco v
$user->getLogoutReason()
?
Editoval enumag (23. 2. 2013 23:45)
- Šolim
- Člen | 20
enumag:
Díky… podrobnosti jsem zaslal emailem.
Tak web běží na oracle db kde mam ID nastavený jako number… a je v ní asi veden jako float, přímo integer jsem u oracle nenašel… zatím jsem se nesetkal, že by to byl nějaký výraznější problém.
Checker hlásí, že bylo být vše v pořádku:
http://physics.mff.cuni.cz/…/checker.php
//edit
dump($user->getLogoutReason()); hlásí NULL
Editoval Šolim (24. 2. 2013 0:18)
- petr.pavel
- Člen | 535
Vzpomněl jsem si, že mě kdysi odhlašoval obrázek, který jsem posílal prohlížeči přes akci presenteru. V hlavním prezenteru jsem měl všechno ok, identita byla, ale protože zobrazená stránka obsahovala obrázek, který mě odhlásil, kamkoliv jsem klikl, už jsem byl odhlášený. Dost specifický případ, ale třeba tě to inspiruje.