Jak přihlásit uživatele na subdoméně ze session non-nette projektu?
- fabian
- Člen | 20
Potřebuji na projektu abc.example.com přihlásit uživatele, který je již prihlášen na example.com. Nastavil jsem tedy cookie_domain na .example.com a na subdoméně mám přístup k $_SESSION. Protože projekt example.com není Nette aplikace, ukládá userid přímo do $_SESSION. Pokud na subdoméně v Nette tuto session objevím, snažím se přilásit uživatele identitou:
if (!$this->user->isLoggedIn() && isset($_SESSION['iduser'])) {
$identity = new \Nette\Security\Identity(
$_SESSION['iduser'], $_SESSION['role']
);
$this->user->login($identity);
}
To se povede, pokud si za tento if dám výpis $this->user->isLoggedIn(), vrací TRUE.
Problém je v tom, že Nette zničí $_SESSION, takže uživatel je odhlášen na example.com. Nette možná odhalí nějaký potenciální podvrh, takže dokonce odhlásí i abc.example.com.
Nemá někdo řešení, které by fungovalo? Na fóru jsem našel různé problémy tohoto typu, které byl způsobeny zaseknutým prohlížečem, nebo Apachem, ale zkoušel jsem už 3 prohlížeče a restart Apache a nic.
Při zkoumání jsem v Nette\Security\User objevil volání
$this->storage->setAuthenticated(TRUE);, které v Nette\Http\UserStorage
setAuthenticated() zavolá $this->sessionHandler->regenerateId();. Pokud
toto zakomentuji, problém se smazáním $_SESSION přetrvává, protože
regenerateId() se volá i Nette\Http\Session start(), které se volá při
každém nastartování sesssion.
Po zakomentování obsahu funkce Nette\Http\Session regenerateId() je vše ok,
ale to je z bezpečnostního hlediska nereálné. Proto hledám nějaké
funkční řešení.
Přijde mi, že toto už musel někdo vyřešit. Najde se někdo takový?:) Díky