Ik weet dat er al aardig wat topics over dit onderwerp geweest zijn, maar ik zit met een vraagstuk dat ik nog niet fatsoenlijk heb kunnen oplossen.
Het gaat om een applicatie met daarin verschillende objecten en functies (objects en operations volgens RBAC), verschillende gebruikers en verschillende rollen.
Om het geheel in dit stadium overzichtelijk te houden ga ik er van uit dat een gebruiker maximaal een rol krijgt toegewezen.
Objecten en rollen zijn hierarchisch
(Klant -> Medewerker -> Taak) (Beheer -> beheer database X -> beheer tabel Y).
Nu zit ik met het volgende vraagstuk:
Een login geeft toegang tot:
a) objecten en functies (bijv: een klant toevoegen)
b) implementaties van objecten (bijv: klant met id=10 wijzigen)
Nu heb ik op dit moment reeds een implementatie die het mogelijk maakt om ook de implementaties van objecten te gebruiken in rechten. Concreet betekent dit dat ik kan zeggen:
- Bekijk overzicht klanten: toestaan
- Object: klanten, implementatie: id=10: weigeren
Wat resulteert in een overzicht met klanten, waarin klant '10' niet zichtbaar is.
Wat ook al mogelijk is, is hierarchie van implementaties, die de hierarchie van de objecten die ze implementeren volgt.
Concreet: als ik klant '10' blokkeer en vervolgens het overzicht met alle medewerkers in het systeem opvraag (medewerker is een child van klant), dan worden alle medewerkers die onder klant '10' vallen verborgen.
Tot dusver de inleiding. Waar ik mee zit is het volgende: hoe sla ik dit fatsoenlijk op? Nu houd ik de implementaties bij in een aparte tabel die de hierarchische structuur van objecten volgt.
Mijn tabellen op dit moment
Hoe zorg ik ervoor dat ik kan zeggen:
- gebruiker X kan nieuwe klanten toevoegen
- gebruiker X kan het overzicht met klanten bekijken
- gebruiker X kan niet bij klant '10' en alle objecten die eronder hangen
Nu zit ik te denken aan domains, die ook hierarchisch zijn:
domain 'Klant' - objects (medewerker, taak)
- domain 'Klant X' - objects (impl van medewerker, impl van taak)
- domain 'Klant Y' - idem
dit zou mogelijk zijn door de tabel met objecten uit te breiden:
Waarin de impl_* velden optioneel zijn.
Redelijk ranzig vind ik echter
Het makkelijkst zou zijn de implementaties direct onder het object te hangen dat ze implementeren, maar dan ben ik de hierachie van de implementaties kwijt (medewerker X hoort bij klant Y, enz).
Ik ben al een half jaartje hiermee bezig (in de vrije uurtjes), en het verbaast me dat hier vrijwel niets over te vinden is. Zaken als bijvoorbeeld phpGACL implementeren wel iets waarmee je implementaties kunt verwerken in je rechten, maar niet hoe je de hierarchie van deze implementaties kunt meenemen.
Het vraagstuk: ik wil een functie in mijn applicatie toestaan, maar niet voor een implementatie en de childnodes van die implementatie, lijkt me toch niet zo heel erg ongebruikelijk.
Misschien is er een makkelijkere manier om dit te doen, haha.
Aangezien er al aardig wat topics over rechten geweest zijn, zullen er vermoedelijk wel mensen zijn die hier wat nuttigs over kunnen zeggen. Brand los zou ik zeggen
Het gaat om een applicatie met daarin verschillende objecten en functies (objects en operations volgens RBAC), verschillende gebruikers en verschillende rollen.
Om het geheel in dit stadium overzichtelijk te houden ga ik er van uit dat een gebruiker maximaal een rol krijgt toegewezen.
Objecten en rollen zijn hierarchisch
(Klant -> Medewerker -> Taak) (Beheer -> beheer database X -> beheer tabel Y).
Nu zit ik met het volgende vraagstuk:
Een login geeft toegang tot:
a) objecten en functies (bijv: een klant toevoegen)
b) implementaties van objecten (bijv: klant met id=10 wijzigen)
Nu heb ik op dit moment reeds een implementatie die het mogelijk maakt om ook de implementaties van objecten te gebruiken in rechten. Concreet betekent dit dat ik kan zeggen:
- Bekijk overzicht klanten: toestaan
- Object: klanten, implementatie: id=10: weigeren
Wat resulteert in een overzicht met klanten, waarin klant '10' niet zichtbaar is.
Wat ook al mogelijk is, is hierarchie van implementaties, die de hierarchie van de objecten die ze implementeren volgt.
Concreet: als ik klant '10' blokkeer en vervolgens het overzicht met alle medewerkers in het systeem opvraag (medewerker is een child van klant), dan worden alle medewerkers die onder klant '10' vallen verborgen.
Tot dusver de inleiding. Waar ik mee zit is het volgende: hoe sla ik dit fatsoenlijk op? Nu houd ik de implementaties bij in een aparte tabel die de hierarchische structuur van objecten volgt.
Mijn tabellen op dit moment
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| table object( id, name, nleft, nright, nlevel (laatste drie zijn mptt kolommen) ) table function ( id, object_id, name ) table object_impl ( id, object_id, realid, nleft, nright, nlevel ) table user ( id, name, ... ) table role ( id, name, nleft, nright, nlevel ) table user_role ( user, role ) table permission ( id, role_id, object_id, function_id, object_impl_id, access (boolean) ) |
Hoe zorg ik ervoor dat ik kan zeggen:
- gebruiker X kan nieuwe klanten toevoegen
- gebruiker X kan het overzicht met klanten bekijken
- gebruiker X kan niet bij klant '10' en alle objecten die eronder hangen
Nu zit ik te denken aan domains, die ook hierarchisch zijn:
domain 'Klant' - objects (medewerker, taak)
- domain 'Klant X' - objects (impl van medewerker, impl van taak)
- domain 'Klant Y' - idem
dit zou mogelijk zijn door de tabel met objecten uit te breiden:
code:
1
2
3
| tabel objects ( id, domain_id, name, impl_domain, impl_object, impl_id, nleft, nright, nlevel ) |
Waarin de impl_* velden optioneel zijn.
Redelijk ranzig vind ik echter
Ik ben al een half jaartje hiermee bezig (in de vrije uurtjes), en het verbaast me dat hier vrijwel niets over te vinden is. Zaken als bijvoorbeeld phpGACL implementeren wel iets waarmee je implementaties kunt verwerken in je rechten, maar niet hoe je de hierarchie van deze implementaties kunt meenemen.
Het vraagstuk: ik wil een functie in mijn applicatie toestaan, maar niet voor een implementatie en de childnodes van die implementatie, lijkt me toch niet zo heel erg ongebruikelijk.
Misschien is er een makkelijkere manier om dit te doen, haha.
Aangezien er al aardig wat topics over rechten geweest zijn, zullen er vermoedelijk wel mensen zijn die hier wat nuttigs over kunnen zeggen. Brand los zou ik zeggen


