Zjisteni vsech prihlasenych uzivatelu, prepinani mezi authenticatory
- TomasTB
- Člen | 13
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
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
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
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ší.
- TomasTB
- Člen | 13
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
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:
- dojde k ukradení ID session
- 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á)