Zjisteni vsech prihlasenych uzivatelu, prepinani mezi authenticatory

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

Je v nette nejakym zpusobem mozne zjistit vsechny prihlasene uzivatele v urcitem namespacu?
A kde prepinat ruzne Nette\Security\IAuthenticator ?

Priklad:
V aplikaci budu mit moduly „frontend“, „backend“ a „webservices“. Budu chtit vytvorit sluzbu, ktera poskytuje vsechny uzivatele prihlasene k frontendu.
V aplikaci budou tri namespace pro uzivatele „frontEnd“, „backEnd“ a „webservice“ a take tri authenticatory „FrontEndAuthenticator“ – overuje login heslo proti DB, „BackEndAuthenticator“ overeni uzivatele pres webservice jineho serveru a „WebserviceAuthenticator“ – overuje nejaky klic drive vydany pro uzivatele webservice.

Nejcasteji pouzity bude FrontEndAuthenticator v configu zaregistruji jeho
service.Nette-Security-IAuthenticator = FrontEndAuthenticator

Potom v Admin_ParentPresenter::startup() – predek vsech admin presenteru musi byt kod

<?php
Environment::getUser()->setNamespace('backEnd');
Environment::getServiceLocator()->removeService('Nette\Security\IAuthenticator');
Environment::getServiceLocator()->addService(new BackEndAuthenticator, 'Nette\Security\IAuthenticator');
?>

a stejne tak v Webservice_ParentPresenter::startup() – predek webservice presenteru bude navic

<?php
Environment::getUser()->setNamespace('webservice');
Environment::getServiceLocator()->removeService('Nette\Security\IAuthenticator');
Environment::getServiceLocator()->addService(new WebserviceAuthenticator, 'Nette\Security\IAuthenticator');
?>

Pokud chceme mit navic ruznou ACL vrstu tak stejne kejkle musime provadet i s Nette\Security\IAuthorizator. Napada nekoho jiny zpusob? Je urceni authenticatoru z configu „lazy“, nebo se pri requestu na admin vytvori frontEndAuthenticator, pak se smaze a vytvori se backEndAuthenticator?

Jo a abych nezapomel na tu prvni otazku je nejak mozne pres nette zjistit vsechny prihlasene uzivatel? Resenim je pri prihlaseni ulozit priznak do DB a pri odhlaseni ho maznout, ale neni nejaky jiny zpusob?

Editoval TomasTB (24. 4. 2009 15:00)

romansklenar
Člen | 655
+
0
-

Zkusím střelit – najít si v session namespace určený při vytváření uživatelů a ten projít?

phx
Člen | 651
+
0
-

Ohledne seznamu prihlasenych lidi zadny zpusob kdome DB neexistuje. Prihlaseni se overuje vuci SESSION a ty jsou unikatni pro kazdeho uzivatele (prohlizec). V PHP neni moznost prolezat cizi SESSION (mozna rucne najit soubor na disku, ale to je sileny). Takze jedine DB. Osobne bych tam misto priznaku ukladal cas posledni aktivity a uzivatele neaktivniho napr 10min bych povazoval za odhlaseneho. Tim osetris to, ze uzivatel zavre prohlizec aniz by kliknul na odhlasit.

romansklenar
Člen | 655
+
0
-

Myslel jsem samozřejmě session na straně serveru, které si hodíš tak abys věděl kde je máš, např:

$session = Environment::getSession();
$session->setSavePath(Environment::expand('%appDir%/sessions'));

tak pak není problém soubory prolézt a vytáhnout si jen to co potřebuju regulárem. Ale pokud jde o rychlost, tak db bude samozřejmě rychlejší.

phx
Člen | 651
+
0
-

Ty jo, netusil jsem, ze to lze v PHP ovlivnit kam session ukladat:))

TomasTB
Člen | 13
+
0
-

phx napsal(a):

Nette User podporuje callback onSignOut(); ktery je volan pri odhlaseni uzivatele at uz jakehokoli duvodu(vcetne zavreni prohlizece), sice me neni moc jasny jak to dela, ale budu verit dokumentaci a priznak bude stacit – nemusim pri kazdem requestu updatovat posledni aktivitu uzivatele.

_Martin_
Generous Backer | 679
+
0
-

TomasTB napsal(a):

phx napsal(a):

Nette User podporuje callback onSignOut(); ktery je volan pri odhlaseni uzivatele at uz jakehokoli duvodu(vcetne zavreni prohlizece), sice me neni moc jasny jak to dela, ale budu verit dokumentaci a priznak bude stacit – nemusim pri kazdem requestu updatovat posledni aktivitu uzivatele.

Bohužel to není zcela pravda, jsou případy, kdy tento callback zavolán nebude. V takovém případě můžou nastat problémy, pokud informace o přihlášených uživatelích jsou ukládány v DB a ID uživatele je použito jako primární (či unikátní) klíč.

Co vím, jde o případy, kdy:

  1. dojde k ukradení ID session
  2. callback je sice zavolán i při „zavření prohlížeče“ – ovšem až s dalším jeho otevřením a následujícím požadavkem (tuším, že při zavření se spešl Nette cookie, zatímco session ID cookie zůstává)