Ik heb een model waarbij objecten beveiligd worden met permissies. Deze permissies zijn variabel en kunnen in principe onbeperkt zijn. Ik heb dan even in grote lijnen ook een tabel met permissies, een tabel met objecten, en een tabel waarbij een permissie en een object een relatie krijgen.
Ik ben een treeview aan het vullen met deze objecten. Als er op een object geen permissies zijn gezet worden deze over geerfd van het eerste object in de bloodline die wel permissies heeft.
Nu wil ik per object een lijst met permissies hebben, zodat ik in de interface bijvoorbeeld het "edit" knopje kan uitschakelen als ik een node in de treeview selecteer waarop ik geen "edit" permissies heb.
Dit betekend dat ik dus voor elk object een functie uitvoer die permissies ophaalt, en dit recursief naar zijn parent uitvoerd (ivm overerven rechten) totdat er permissies zijn gevonden. Om het geheel nog eventjes erger te maken, op een object kan ik groepen, rollen, en users hangen. Elk van deze drie bestaat uit een configuratie van permissies. Een rol override de rechten van een groep, en een user override de rechten van een rol.
Als er op een object dus een groep hangt met het recht "edit", maar ik als user ben ook gedefinieerd op het object maar zonder het recht "edit" dan betekend dit uiteindelijk dat ik geen "edit" rechten heb.
Om een lang verhaal kort te houden, de performance hit voor deze lookup is veel te zwaar per object. Het begint bij 40ms en het eindigt bij 180ms per lookup omdat de server echt moet beuken. Er moeten namelijk per object permissies worden opgehaald, en overrides worden bepaald.
Waar ik naar aan het kijken ben is een methode om een soort lookup table te creeeren voor razendsnel bepalen van permissies. Dat zou betekenen echter dat ik voor elk object alle mogelijke mogelijkheden moet opslaan, dat moet efficienter kunnen.
Dit is op zich snel, maar ontzettend gevoelig, maar ik was benieuwd of er mensen voor zelfde problemen hebben gestaan.
Als je maar een enkel object bewerkt en op rechten checked is het een non-issue. Maar als je bijvoorbeeld 100x een object ophaalt voor de treeview dan wordt het een ramp.
Ik heb hier een gedeelte van het diagram staan, waarbij ik de permissie gedeeltes rood heb gemaakt:
http://www.mschopman.demon.nl/diagram.gif
Ik ben een treeview aan het vullen met deze objecten. Als er op een object geen permissies zijn gezet worden deze over geerfd van het eerste object in de bloodline die wel permissies heeft.
Nu wil ik per object een lijst met permissies hebben, zodat ik in de interface bijvoorbeeld het "edit" knopje kan uitschakelen als ik een node in de treeview selecteer waarop ik geen "edit" permissies heb.
Dit betekend dat ik dus voor elk object een functie uitvoer die permissies ophaalt, en dit recursief naar zijn parent uitvoerd (ivm overerven rechten) totdat er permissies zijn gevonden. Om het geheel nog eventjes erger te maken, op een object kan ik groepen, rollen, en users hangen. Elk van deze drie bestaat uit een configuratie van permissies. Een rol override de rechten van een groep, en een user override de rechten van een rol.
Als er op een object dus een groep hangt met het recht "edit", maar ik als user ben ook gedefinieerd op het object maar zonder het recht "edit" dan betekend dit uiteindelijk dat ik geen "edit" rechten heb.
Om een lang verhaal kort te houden, de performance hit voor deze lookup is veel te zwaar per object. Het begint bij 40ms en het eindigt bij 180ms per lookup omdat de server echt moet beuken. Er moeten namelijk per object permissies worden opgehaald, en overrides worden bepaald.
Waar ik naar aan het kijken ben is een methode om een soort lookup table te creeeren voor razendsnel bepalen van permissies. Dat zou betekenen echter dat ik voor elk object alle mogelijke mogelijkheden moet opslaan, dat moet efficienter kunnen.
code:
1
2
3
4
5
6
| objectid groupid rollid userid permissionlist 1 1 null null add,edit,remove 1 2 null null add 1 3 null null edit,remove 1 null 1 null edit,remove,publish 1 null null 1 remove |
Dit is op zich snel, maar ontzettend gevoelig, maar ik was benieuwd of er mensen voor zelfde problemen hebben gestaan.
Als je maar een enkel object bewerkt en op rechten checked is het een non-issue. Maar als je bijvoorbeeld 100x een object ophaalt voor de treeview dan wordt het een ramp.
Ik heb hier een gedeelte van het diagram staan, waarbij ik de permissie gedeeltes rood heb gemaakt:
http://www.mschopman.demon.nl/diagram.gif
[ Voor 8% gewijzigd door Verwijderd op 20-01-2005 21:06 ]