autentizace proti vice „zdrojum“
- wdolek
- Člen | 331
jsem v situaci, kdy mam vice druhu uzivatelu – s kterymi chci ale samozrejme pracovat jednotne (sprava roli, prihlaseni do systemu).
uvedu priklad – mam treba databazi Foo, v ktere je tabulka „cs_ct“, a databazi Bar (treba uplne na jine masine), v ktere je tabulka „cs_t“ …
pri pouziti login/heslo nemuzu samozrejme urcit, do jake skupiny uzivatel, ktery se prihlasuje, patri. proto budu mit na strance vice formularu, popripade nejake pulldown menu, ktere urci, o koho vlastne jde a s cim mam porovnavat login/heslo.
jak ale mohu dynamicky zaregistrovat autentikacni tridu? :) nebo jak se takovato vec resi?
- Jod
- Člen | 701
Moc nechápem očo ti ide, takže neviem či to ide spraviť aj efektívnejšie, auth handler sa registruje v Nette/Web/User
- Nilp
- Člen | 65
Ja mam v BasePresenteru tuhle metodu:
protected function setupAuthentication($namespace, $authenticator)
{
$locator = Environment::getServiceLocator();
$locator->addService($authenticator, 'Nette\Security\IAuthenticator');
Environment::getUser()->setNamespace($namespace);
}
a pote treba v Admin_BasePresenter::startup
volam
$this->setupAuthentication('admin', 'AdminModel')
.
- wdolek
- Člen | 331
Jod: user/heslo mam z vice zdroju (napriklad db s ucty lekaru je jinde, nez db s ucty uklizecek) – chci vsak, aby se vsichni mohli na web prihlasit (samozrejme s vyberem patricneho formulare pro zalogovani se)
Nilp: no vypada to pekne :P ale stejne kdyz na to cucim, nenapada me, kam to zabudovat… a hlavne jak…
chvilku sem premyslel a napadlo me opravdu proste reseni. vzhledem k tomu, ze musim mit vice „authenticate( )“ metod (pro kazdy typ uctu), budu mit tim padem vice handleru. konkretni formular na strance se posila na konkretni handler – a v nem uz proste jen reknu, v jake tride ze je autentikace pro daneho uzivatele…
tedy napriklad logovani pro lekare pujde pres MedicLoginPresenter::loginPosted; logovani pro uklizecky pujde pres CleanerLoginPresenter::loginPosted
:) ale teda ;D jeste aby to fungovalo tak jak chci…
- Ondřej Mirtes
- Člen | 1536
Můžeš mít jednu authenticate metodu, která prohledá obě tabulky. A pro kontrolu ACL ti už stačí opravdu jeden mechanismus, stačí, aby obě tabulky sdílely jednu tabulku autorizačních rolí.
- wdolek
- Člen | 331
LastHunter: jakoze bych dostal login/heslo – zkusil ho na prvni skupine
uctu, kdyz by se to neujalo, sel bych na druhou skupinu uctu… az bych skoncil
u n-te skupiny uctu ? to se mi zrovinka moc nelibi.
jinak role budu mit asi natvrdo v aplikaci, v databazi pak bude jen nejaky
string – snad ani zadne dedeni roli nevyuziju.
jak je to s temi jmenymi prostory uzivatelu? to se ulozi do session/cookie, nebo pak budu muset pri kazdem hitu stranky zjistovat znovu a znovu a znovu, do jake skupiny uzivatel patri?
- mlady
- Člen | 24
Jedným z riešení by bolo aj to, že by si pre každý typ prihlásenia vytvoril samostatnú triedu (LekariAuth, UpratovackyAuth, …), ktorá by implementovala rozhranie Nette\Security\IAuthenticator. Potom by si vytvoril nejaký SuperAuthenticator (ktorý by tiež implementoval toto rozhranie) a pri prihlásení by si jednoducho poslal údaje SuperAuthenticator-ovi a on by to delegoval na tú správnu triedu.
- Nilp
- Člen | 65
wdolek: overovani uzivatelu mi zajistuje prislusna trida modelu:
UserModel
, AdminModel
, atd; ta implementuje interface
IAuthenticator
. Presentery mam rozdelene treba takto:
BasePresenter
`-- User_BasePresenter
`-- User_HomepagePresenter
`-- Admin_BasePresenter
`-- Admin_DashboardPresenter
V BasePresenter
implementuju tu vyse uvedenou metodu.
V BasePresenterech modulu (User
, Admin
) mam metodu
authorize
, ktera mi overi jestli je uzivatel/admin prihlaseny,
v urcitych rolich apod.
No a v tech final presenterech nastavim pres setupAuthenticate
namespace, do ktereho se budou ukladat autentifikacni udaje (takze muzes byt
zaroven prihlaseny jako admin i jako uzivatel) a autentifikacni handler. Dale
uz volam jen metodu authorize
, a to bud ve startup
nebo v jednotlivych akcich final presenteru.