Problém se session při přesunu webu z Linuxu na Windows
- serten
- Člen | 55
Zdravím,
objevily se mi potíže se session při přesunu jednoho staršího webu, který běží na Nette verze 2.0. Potřebuji přesunout tento web z Linuxového serveru na Windows server. Vše jsem si tam nastavil a Nette Checkerem jsem si zkontroloval nastavení. Vše je nastaveno v pořádku. Bohužel je ale problém se session. Když se zkouším na webu přihlásit, tak přihlášení proběhne v pořádku, identita se uloží do sessiony, ale po přesměrování je prázdná. Kontroloval jsem cookies a je v ní správně uložené ID. Nenapadá vás někoho důvod, proč to tohle dělá? Je někde problém v nastavení?
Díky za pomoc
- Tomáš Votruba
- Moderator | 1114
Ahoj, Windows sice nepoužívám, ale napadají mě práva k temp adresáři nebo adresáři kde jsou uložené sessions.
- serten
- Člen | 55
@TomášVotruba a @GEpic Tak situace se trochu změnila. V těchto věcech bohužel chyba není. Zkusil jsem na stejném serveru jinou Nette aplikaci, akorát pod jinou verzí PHP. Běží to na Nette 2.4 a PHP 5.6.2. Ta nefungující běží na PHP 5.4.9. Když pořádně procházím proces přihlášení, tak ona vlastně session existuje. Ale identita je prázdná. Ještě před přesměrováním je v session uložená a jsou tam správná data. Jakmile se ale provede přesměrování, tak identita je prázdná a authenticated je na NULL. Napadá vás důvod?
Editoval serten (3. 7. 2016 22:22)
- GEpic
- Člen | 566
serten napsal(a):
@TomášVotruba a @GEpic Tak situace se trochu změnila. V těchto věcech bohužel chyba není. Zkusil jsem na stejném serveru jinou Nette aplikaci, akorát pod jinou verzí PHP. Běží to na Nette 2.4 a PHP 5.6.2. Ta nefungující běží na PHP 5.4.9. Když pořádně procházím proces přihlášení, tak ona vlastně session existuje. Ale identita je prázdná. Ještě před přesměrováním je v session uložená a jsou tam správná data. Jakmile se ale provede přesměrování, tak identita je prázdná a authenticated je na NULL. Napadá vás důvod?
A ty používáš to IIS? Nedávno si tu tento problém se session již na
fóru zmiňoval.
Zkoušel si třeba WAMP? Sám vyvíjím na widlích a stačilo wamp
nainstalovat, a vše fungovalo as expected.
Editoval GEpic (3. 7. 2016 22:29)
- serten
- Člen | 55
Ano, běží to na IIS. Popravdě začal jsem přemýšlet o instalaci
XAMPPu díky těmhle všem problémům. Ale potřebuju kvůli dvěma verzím
Nette mít taky dvě verze PHP. Nebo je možné na novější verzi PHP
rozběhat i starší verzi Nette? Celkem dost se bojím té zpětné
kompatibility.
Jinak obě verze PHP jsou nastaveny stejně. Každá má svůj vlastní
adresář pro session, takže k náhodnému přepisování by nemělo dojít.
Ale proč se teda identita v UserStorage neuchová?
- GEpic
- Člen | 566
serten napsal(a):
Ano, běží to na IIS. Popravdě začal jsem přemýšlet o instalaci XAMPPu díky těmhle všem problémům. Ale potřebuju kvůli dvěma verzím Nette mít taky dvě verze PHP. Nebo je možné na novější verzi PHP rozběhat i starší verzi Nette? Celkem dost se bojím té zpětné kompatibility.
Jinak obě verze PHP jsou nastaveny stejně. Každá má svůj vlastní adresář pro session, takže k náhodnému přepisování by nemělo dojít. Ale proč se teda identita v UserStorage neuchová?
Mám na Savaně PHP 5.6 a běží mi Nette jak 2.3 tak 2.4. Starší verze Nette bohužel netuším. Každopádně jedná se o projekty využívající mnoho funkcí napříč frameworkem a zatím na žádném z projektů problém nebyl. Každopádně pokud ti to běželo na PHP 5.4, jako mě Savana do nedávna, neměl by být problém.
Editoval GEpic (3. 7. 2016 23:11)
- serten
- Člen | 55
@CZechBoY No je právě sranda, že mi to nevyhazuje žádnou chybu. Tady je postup a kroky, kterými jsem to testoval, ale k ničemu kloudnému jsem se nedostal:
Přihlášení je jednoduché a má tento kód:
public function signInFormSubmitted($form)
{
$this->template->loginForm = $form;
$values = $form->getValues();
$this->getUser()->setExpiration('+ 14 days', FALSE);
try {
$this->getUser()->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
return;
}
$this->redirect('Order:');
}
V try větvi jsem si ihned po loginu nechal vydumpovat identity uživatele a je tam následující obsah:
Nette\Security\Identity(4) {
id private => 19
roles private => array(1) [
0 => "admin" (5)
]
data private => array(10) {
id => 19
role_id => "admin" (5)
username => "jano" (4)
name => "jano" (4)
lastname => ""
email => "some@email.cz" (21)
created => Nette\DateTime(3) {
date => "-0001-11-30 00:00:00" (20)
timezone_type => 3
timezone => "Europe/Prague" (13)
}
updated => Nette\DateTime(3) {
date => "2016-03-15 22:40:31" (19)
timezone_type => 3
timezone => "Europe/Prague" (13)
}
deleted => "0"
role => array(2) {
id => "admin" (5)
name => "Administrator" (13)
}
}
frozen private => FALSE
}
Když to ale nechám přesměrovat dál a provedu dump po přesměrování hned v BasePresenteru v startup metodě, tak identita je NULL a UserStorage má tenhle obsah:
Nette\Http\UserStorage(3) {
namespace private => ""
sessionHandler private => Nette\Http\Session(4) {
regenerated private => NULL
options private => array(14) {
gc_maxlifetime => 1209600
cookie_lifetime => 1209600
referer_check => ""
use_cookies => 1
use_only_cookies => 1
use_trans_sid => 0
cookie_path => "/"
cookie_domain => ""
cookie_secure => FALSE
cookie_httponly => TRUE
cache_limiter => NULL
cache_expire => NULL
hash_function => NULL
hash_bits_per_character => NULL
}
request private => Nette\Http\Request(9) {
method private => "GET" (3)
url private => Nette\Http\UrlScript(10) { ... }
query private => array(0)
post private => array(0)
files private => array(0)
cookies private => array(2) { ... }
headers private => array(13) { ... }
remoteAddress private => "127.0.0.1" (9)
remoteHost private => "127.0.0.1" (9)
}
response private => Nette\Http\Response(5) {
cookieDomain => ""
cookiePath => "/"
cookieSecure => FALSE
cookieHttpOnly => TRUE
code private => 200
}
}
sessionSection private => Nette\Http\SessionSection(5) {
session private => Nette\Http\Session(4) {
regenerated private => NULL
options private => array(14) { ... }
request private => Nette\Http\Request(9) { ... }
response private => Nette\Http\Response(5) { ... }
}
name private => "Nette.Http.UserStorage/" (23)
data private => array(1) {
authenticated => NULL
}
meta private => NULL
warnOnUndefined => FALSE
}
}
Z tohoto důvodu není uživatel přihlášený a hodí mě to zpět na přihlašovací stránku. Budou stačit tyhle informace nebo potřebujete nějaké další info? Konkrétně se jedná o Nete 2.0.6.
Editoval serten (4. 7. 2016 20:30)
- serten
- Člen | 55
Ten projekt už má taky pár let. Jen ho dočasně bohužel musím
přesunout, aby se dal ještě spravovat a používat před dokončením nové
verze.
Před odesláním je obsah SESSION[„__NF“] následující:
array(5) {
C => 16
Time => 1467658285
B => "qzorckxumo" (10)
DATA => array(1) {
"Nette.Http.UserStorage/" => array(9) {
authenticated => TRUE
expireTime => "1468867980" (10)
expireDelta => 1209600
expireIdentity => FALSE
expireBrowser => FALSE
browserCheck => TRUE
identity => Nette\Security\Identity(4) { ... }
reason => NULL
authTime => 1467658380
}
}
META => array(1) {
"Nette.Http.UserStorage/" => array(3) {
browserCheck => array(2) { ... }
foo => array(2) { ... }
identity => array(1) { ... }
}
}
}
Session ID je trcsb7urko8r2hmm0dps7q4a46.
Po přesměrování je SESSION[„__NF“]:
array(5) {
C => 18
Time => 1467658285
B => "qzorckxumo" (10)
DATA => array(1) {
"Nette.Http.UserStorage/" => array(1) {
authenticated => NULL
}
}
META => array(1) {
"Nette.Http.UserStorage/" => NULL
}
}
A až teď si všímám že Session ID se změnilo na 1msid0eq8r2adeqkul6tg70050. Tohohle jsem si před tím nevšiml. Při tom jsem pořád na stejném webu. Z website.local přecházím na website.local/order/
Chápu, že tohle je teda ten problém chybějící identity, ale proč se to session ID mění?
- serten
- Člen | 55
Tak vyřešeno, bohužel chyba byla v kusu kódu hned na začátku v indexu, který jsem přehlédl :-( Ten byl na míru šitý pro daný operační systém. Díky přesunu mi to potom při každém novém načtení stránky přepisovalo session a taky session id. Příště je hold potřeba se víc dívat :-( Jinak díky za pomoc a rady @CZechBoY a @GEpic