Odhlasovanie (session expiration)
- PattoSK
- Člen | 3
Caute,
Mam taky problem a to u viacerych projektov (jeden na Nette 2.0., dalsi na 2.1.) ze uzivatelov odhalsuje skor ako by malo.
Pred prihlasenim nastavujem expiration na 2 tyzdne:
$this->user->setExpiration('+ 14 days', FALSE);
V configu mam nastavene:
session:
expiration: 14 days
Ked si vydumpujem hodnotu:
ini_get('session.gc_maxlifetime')
Dostanem hodnotu 1209600
co je spravne ale aj tak po cca 1–2
hodine uzivatela odhlasi.
Cookie PHPSESSID
mam taktiez nastavene na 2 tyzdne.
Nechapem uz kde by mohla byt chyba :-/
Neviete v com by mohol byt este problem?
- kolsi
- Člen | 131
Ahoj,
zrovna jsem chtěl položit stejný dotaz a koukám, že už tu je ale bez odpovědi.
Najde se někdo, kdo by pomohl problém vyřešit? Už si s tim lámu hlavu několik dní. Expirace session je nastavená na 14 dní, expirace uživatele na několik hodin, ale přesto dojde k odhlášení cca po 1 hodině.
Co jsem tak vypozoroval, tak se zdá, že vyprší cookie (či SessionSection nebo jak se to správně jmenuje), která drží data o tom, kdy se uživatel přihlásil a kdy má dojít k odhlášení. Ale nic nenasvědčuje tomu, že by někde byla uložená hodnota, která by to vypršení měla způsobit.
Kokrétně tento řádek v UserStorage.php z Nette 2.0.15:
$this->sessionSection = $section = $this->sessionHandler->getSection('Nette.Http.UserStorage/' . $this->namespace);
$this->sessionSection obvykle má obvykle vrátit objekt, kde je uložen ten čas přihlášení, expirace atd. V době, kdy ale dojde k nepožadovanému odhlášení tento objekt žádná data nenese. Konkrétně FireLogger vypíše:
� "(object) Nette\Http\SessionSection"
data Object { expireTime=null}
meta null
name "Nette.Http.UserStorage/"
session Object { �="(object) Nette\Http\Session", regenerated=true, options=" … ", více...}
� "(object) Nette\Http\Session"
options " … "
regenerated true
request " … "
response " … "
warnOnUndefined false
Nějaký nápad?
- jannek19
- Člen | 47
Nemohl by být problém v tom, že nějaký jiný PHP proces (tj. třeba cron, nebo něco podobného) provede po určité době (2 hodiny) vyčištění session storage od (z jeho pohledu) starých session dat? Tj. jiný proces má jiné nastavení pro session/cookie/… a podle toho se tak prostě chová, což se projevuje tím, že dochází k odhlášení uživatelů?
Střílím od boku, třeba je problém v něčem jiném.
- kolsi
- Člen | 131
A dá se to něčím vysledovat?
Jediné, co se mi podařilo zjistit je, že $_SESSION v tu dobu už neobsahuje
data, co má, ale název té session je pořád stejný (výpis proměnné
$_SESSION ihned po session_start()). V nette se pak nastaví „regenerated“
na true. Kdyby se to dalo aspoň lehce odladit, ale doplnit ladící výpisy, a
pak přes hodinu čekat, trochu zdržuje.
- Quinix
- Člen | 108
Pokud ti app běží na Debianu, tak je problém v mazání session cronem – https://forum.nette.org/…-does-t-work#…
- jannek19
- Člen | 47
Vysledovat se to v podstatě nedá, maximálně příjdeš na to, že tam ta data už nejsou, ale v podstatě nejsi schopen zjistit, jak došlo k jejich smazání. V podstatě se může jednat o to, co o něco výš popisuje Quinix, tj. může dojít k odstranění např. v rámci cron úlohy, která si z php.ini vytáhne expiraci dat v úložišti a pak úložiště vymaže.
Nebo může smazání způsobit třeba nějaký PHP skript, nebo aplikace, pracující nad stejným session úložištěm, ale s jinak nastavenou expirací – častokrát se ti to může stát např. na localhostu: na //localhost/app-1/ ti běží aplikace s expirací A a na //localhost/app-2/ máš aplikaci s expirací B a tyhle 2 aplikace si ty session data klidně můžou navzájem mazat (nehledě na to, že si je pravděpodobně budou i navzájem přepisovat, toho si ale nemusíš hned všimnout, např. dokud se ti v app1 neobjeví uživatel z app2 :D)
Takže maximálně ověřit kam si app ukládá session data a jestli nad stejným úložištěm nepracuje ještě někdo jiný. Víc poradit nedokážu :( Možná někdo zkušenější.
- kolsi
- Člen | 131
Ještě se vracím k tomuto problému. Problém jsem vyřešil podle odkazu tím, že jsem do configu přidal
session:
expiration: 14 days
savePath: %appDir%/../temp/sessions
A teď po dvou měsících koukám, že složka „sessions“ obsahuje přes 15000 souborů. Je to normální? Čekal bych, že když je nastaveno „expiration“ na 14 dní, tak je to bude po 14 dnech mazat. Nebo to nedělá automaticky a musím si to pořešit sám?