Náhodné odhlášení uživatele
- d@rkWolf
- Člen | 167
Mám modulární aplikaci(Front/Admin) na Nette 2.2.7, v případě přihlášení a práce v Admin modulu se semtam-podle dosud zjištěných situací naprosto náhodně odhlásí uživatel. Session zmizí, objevím se s „not logged“ na přihlašovací stránce do adminu. U starších webů založených na stejné aplikaci se to pokud vím nestává a zdá se to být čistě back-end problém(přihlašování je oddělené, zvláštní tabulky s daty, dokonce až tak, že front-end používá Doctrine, zatímco v adminu jsou useři přes Dibi).
Session má nastavenou výchozí expiraci na +7 days v neonu a pro admin přihlášení je upravená přes setExpiration na buď 7 dní při zaškrnutí „zůstat přihlášen“, nebo na 4 hodiny bez zaškrnutí checkboxu.
V logu nette se nezachytává žádná chyba, nebo min. žádná, která by jakkoliv týkala back-endu. Logy ze serveru mám 1-den zpětně, aktuální sem ještě neviděl, ale z předchozího dne ani v nich nebylo nic mě podezřelého.
Snažil jsem se to jakkoliv nasimulovat a neúspěšně, ale jednou mě to třeba odhlásilo prostě při kliknutí na odkaz odevírající editaci položky(normální link přes presenter:edit id=>$item->id), potom to třeba 50× tu editaci této i jiných položek normálně otevřelo bez odhlášení.
Jediná změna, kterou se aktuální verze aplikace v adminu liší je, že běží na https, což už nicméně bylo vyzkoušeno i dříve a z předchozího webu podobné chování pozorované nemám(což může jen znamenat, že si toho nikdo nevšiml, ale je to už nějakej pátek).
Https je zařízené nastavením Route::SECURED k routám, u session je zapnuto cookie_secure: true, v htaccess je přesměrování na https a na začátku bootstrapu je vložen tenhle kód nalezený jinde tady na fóru(problém s reverzní proxy před vms-active24)
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' && isset($_SERVER['SERVER_PORT']) && in_array($_SERVER['SERVER_PORT'], [80, 82])) { // https over proxy
$_SERVER['HTTPS'] = 'On';
$_SERVER['SERVER_PORT'] = 443;
} elseif ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'http' && isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 80) { // http over proxy
$_SERVER['HTTPS'] = 'Off';
$_SERVER['SERVER_PORT'] = 80;
}
}
?>
Nevím, jestli něco z tohoto může mít spojitost. Vůbec mě nenapadá, co by mohlo občasné, náhodné výpadky session způsobovat, nesetkali jste se někdo s něčím podobným?
- ZahorskyJan
- Člen | 59
@d@rkwolf Platnost session v nette aplikaci je jedna věc a druhá věc je, jak se k session chová server. Standardně existuje nějaký cron, který se pravidelně spustí a smaže všechny session soubory, co jsou starší (last touch) než časový interval nastavený někde v php.ini
Takže i když u session v nette je +14 dnů a cron to dělá po kratším intervalu, tak těch 14 dnů nebude nikdy fungovat.
- Michal Hlávka
- Člen | 190
Nemuze byt podle tebe chyba tam, kde zjistujes jestli uzivatel existuje, jestli je opravnenej v tehle casti byt, jestli session existuje a dalsi veci co ze toho muzou tykat?