Řízení přístupu v malém intranetu

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

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
+
0
-

Ř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
+
0
-

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)