ACL přihlášení ve dvou oknech prohlížeče – přepíše se první

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

Ahoj, předem se chci omluvit za hloupý dotaz, ale nevím jak dál. Používám ACL s uživatelskou a adminovskou částí (mají společné přihlašování). Logování funguje bez problémů dokud se nepřihlásím z jiného okna na jiného uživatele, čímž se přepíše i uživatel v předchozím okně. Pokud se v jednom okně odhlásím, odhlásí mě to i z druhého. Mohl by mě prosím někdo nasměrovat?

newPOPE
Člen | 648
+
0
-

Mam pocit, ze to je uplne normalne kedze sa jedna o jednu SESSION.

  1. Prihlasenie v 2och prehliadacoch
  2. Prihlasenie pre admina a usera nastavit iny namespace vid. dokumentacia
<?php
	$user = Env...getUser();
	$user->setNamespace('Admin'); //napr...
	$user->loggedIn(...);
?>

ale potom pri praci s admin namespacom musis zrejme nastavovat napr. v AdminBasePresenter ze chces pouzivat „admin“ namespace pre pracu s userom…

Phalanx
Člen | 310
+
0
-

Přihlašuju se ze stejného prohlížeče. I když se přihlásím na ze dvou uživatelů tak se mi stejně mění session prvního a v obou sessions mám pak stejného (toho druhého přihlášeného). To právě nechci. Potřebuju ty session mít pro každé přihlášení rozdílné.

Díky za ochotu

Tharos
Člen | 1030
+
0
-

V takovém případě musíš používat v session jmenné prostory. Nabízí se možnost, aby pro každého uživatele existoval vlastní jmenný prostor.

Phalanx
Člen | 310
+
0
-

V každém souboru v UserModule mám: namespace UserModule; podle ukázkové aplikace.

v bootstrap.php pak mám (používám i jednoduchý nákupní košík)

<?php
$session = Environment::getSession();
$session->setExpiration('+ 100 days');
$session->setSavePath(dirname(__FILE__) . '/sessions/');
?>

v secured presenteru pak používám ten košík

<?php
$namespace = Environment::getSession('cart');
if (!isset($namespace->cart))
	$namespace->cart = array();
?>

Ale nechápu jak to mám podle tvého návodu udělat. Není na to někde návod prosímtě?

Tharos
Člen | 1030
+
0
-

Ty musíš v aplikaci vždy, kdy inicializuješ instanci Nette\Web\User, nastavit jmenný prostor uživatele přes Nette\Web\User::setNamespace. Viz API. Úplně přesně tak, jak píše NewPOPE.

Phalanx
Člen | 310
+
0
-

já ale nechci oddělit uživatelskou a adminskou část, to si řeším jinak. Chci abych měl při každém přihlášení uživatele jinou relaci aby se při přihlášení v jiném oknu prohlížeče nemleli mezi sebou.

přes $user->setNamespace(‚UserModule‘); přece pošlu oba uživatele do stejného namespace nebo se mýlím?

Ondrej
Člen | 110
+
0
-

Phalanx napsal(a):

aby se při přihlášení v jiném oknu prohlížeče nemleli mezi sebou.

řešení je nepřenášet identifikátor session v cookie, ale přenášet ho napříč webem v URL, což ale není moc bezpečné.

Tharos
Člen | 1030
+
0
-

Phalanx: Ty si ale můžeš vytvořit neomezený počet namespace. Ve Tvém případě nebudeš mít dvě namespace (jedno pro frontend a jedno pro backend), ale vlastní namespace pro každého uživatele. Pak můžeš volat $user->setNamespace('userId') a to vyřeší Tvůj problém. Session jmenné prostory mají široké uplatnění, neslouží jen k rozdělení přihlašování do frontendu a backendu.

Celkově bych ale zvážil, jestli podobné vytváření moře jmenných prostorů stojí za to (prakticky jenom kvůli testování, v produkci mi nepřipadá, že by to bylo jakkoliv užitečné).

Editoval Tharos (27. 3. 2011 17:02)

Aurielle
Člen | 1281
+
0
-

Ondrej napsal(a):

řešení je nepřenášet identifikátor session v cookie, ale přenášet ho napříč webem v URL, což ale není moc bezpečné.

V Nette nemožné a představuje to obrovskou bezpečnostní díru.

Phalanx
Člen | 310
+
0
-

Tharos: super! to je to co sem potřeboval, moc díky :) $user->setNamespace(‚userId‘)
jdu to prozkoušet a pokusím se na to ještě najít nějaký příklad