Řízení přístupu v malém intranetu
- dcepelik
- Člen | 36
Zdravím,
rád bych se zeptal ostatních, jak by řešili následující problém. Stavím aplikaci, která rozlišuje tři typy uživatele: studenta, zaměstnance a správce.
O studentech systém eviduje jiné informace než o zaměstnancích. Student i zaměstnanec mohou být současně správci, správce nemusí být ani student, ani zaměstnanec. Část aplikace pro studenty je zcela jiná, než část zaměstnanecká, tzn. typ uživatele je více než „pouhá role“.
Za nejjednodušší řešení považuji definovat třídu Uživatel (impl.
Nette\Security\IIdentity
), která je společným rodičem tříd
Student a Zaměstnanec. V databázi je hierarchie realizována jako Class
Table Inheritance.
Řešení role správce je potom triviální: pro každý záznam v tabulce
users
je definována logická hodnota určující, zda má
uživatel práva správce.
Uvědomuji si ale, že tento přístup je absolutně neflexibilní. Hrál jsem si s myšlenkou zavést (i přes výše uvedené) standardní přístup založený na rolích. Avšak vzhledem ke skutečnosti, že studenty a zaměstnance mám reprezentované rozdílnými třídami a rozdílnými tabulkami v databázi, zavedení rolí přinese paradoxy. (Nač rozlišovat role, je-li každá role reprezentována jinou třídou a počet rolí je konstantní?)
Můj další nápad byl použít pro všechny typy uživatele standardní
Nette\Security\Identity
a k datům přistupovat přes pole
Identity::$data
.
Problém lze zobecnit na „jak zavést role, pokud je každou třeba reprezentovat jinou třídou“. Mám stále pocit, že nejlepší řešení mi uniká.
Který přístup je podle vás nejlepší?
- na1k
- Člen | 288
Řešil jsem vpodstatě stejný problém – školní projekt „fakultní
informační systém“, kde jsou odlišení právě studenti, zaměstnanci
(učitelé, asistenti,…) a správci (vytváří účty, předměty, nastavuje
kdo co učí,…).
Rozdělení pomocí rolí mi naprosto stačilo :-)
V tvém případě bych se zbavil oddělených tabulek, zavedl tabulku „uživatelé“, stejně jako bych zavedl jedinou třídu, reprezentující obecného uživatele (nad kterým budeš provádět login/out, acl). Po přihlášení a ověření práv bych uživatele přesměroval na odpovídající část aplikace (nejspíše modul), kde bych mohl bez problémů nahradit obecnou třídu uživatele jejím konkrétním potomkem (případné doplňující informace by byly v oddělené tabulce).
Tedy obecně neuvažovat směrem „třída definuje roli“, ale naopak „role definuje třídu“, kde role vychází z jediné tabulky uživatelů. Potom si budeš moct dovolit i kombinace, kdy je uživatel vyučující i student (typicky doktorandi) a využiješ role (a případně acl) v jejich plné síle.
- dcepelik
- Člen | 36
na1k napsal(a):
Po přihlášení a ověření práv bych uživatele přesměroval na odpovídající část aplikace (nejspíše modul),
kde bych mohl bez problémů nahradit obecnou třídu uživatele jejím konkrétním potomkem (případné doplňující
informace by byly v oddělené tabulce).
To byl ten kousek, který mi chyběl! Díky moc.
Editoval dcepelik (30. 8. 2011 7:33)