Odhlasovanie (session expiration)

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
+2
-

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
+
0
-

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
+
0
-

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?