Posto se pokretac thread-a ne javlja vec 2 dana verovatno je resio problem, ali 'for the sake of argument' ja bi dodao nesto "malo" na temu.
Nivoi pristupa su OK, ali ako treba puna fleksibilnost sistema privilegija mislim da to nije dovoljno. Pretpostavimo da privilegije ne idu uvek sistemom podskupova (tj. nivoima pristupa), nego npr. da neki korisnici mogu da vrse operacije samo jedne grupe, a neki samo operacije neke druge grupe. A ima P grupa korisnika i Q grupa privilegovanih operacija. Sa nivoima pristupa morao bi onda da se definise floor i ceiling nivoa pristupa za svaku operaciju i neko bi morao da se posteno oznoji da uklopi te brojke koje bi predstavljale nivoe korisnickog pristupa, da ne pominjem kasnije nadogradnje sistema i sl. egzibicije...
S'druge strane, koriscenje "par brojeva", pogotovu dodavanje klasa za privilegije je neekonomicno i veoma bug-prone (po mom misljenju).
Mislim da bi ovde mozda bolje resenje bili flegovi spakovani u jedan Integer, znaci sa jednim integerom bi pokrili do 32 privilegije.
Privilegije definises kao konstante sa vrednostima 1, 2, 4, 8, 16, 32...
Npr. PrvRead=1, PrvWrite=2, PrvDelete=4... Sada, ako korisnik ima privilegije PrvRead, PrvWrite i PrvDelete njegov kljuc je UserPrv := PrvRead or PrvWrite or PrvDelete. Za neku operaciju za koju su porebne samo read i write prvilegije, kljuc je ServicePrv := PrvRead or PrvWrite. Kada proveravamo da li neki korisnik ima potrebne privilegije za operaciju uradimo sledece:
Code:
if UserPrv and ServicePrv=ServicePrv then
OK;
else
NeOK;
Ove bitwise zajebancije su inace jako korisne i za mnoge druge stvari...
Istu stvar radi i Delphi "ispod haube" sa svojim setovima, tako da sve ovo u Delphiu moze i sa npr.
Code:
type TPrivileges = set of (PrvRead, PrvWrite, PrvDelete)
UserPrv, ServicePrv: TPrivileges;
UserPrv := [PrvRead, PrvWrite] + [PrvDelete] - [PrvWrite]...
if UserPrv * ServicePrv = ServicePrv then ...
Elegantno i sigurno...
Jedino je problem sto se setovi ne mogu lako strimovati, npr. zapisati u bazu ili Tag property, nego se moraju strimovati kao Integer^ ili Byte^ na @SetPrivilegija. Workaround je O.Pascal-ova varijanta C-ovog union-a, iliti case uokviru record-a (jako nepopularno
Code:
type TPrivileges = set of (PrvRead, PrvWrite, PrvDelete);
type TValuedPrivileges = record
case Boolean of
True: (Privileges: TPrivileges);
False: (Value: Byte);
end;
Na ovaj nacin TValuedPrivileges.Value i TValuedPrivileges.Privileges pokazuju na istu mem. lokaciju posmatranu iz dva ugla, prema tome TValuedPrivileges se mogu strimovati.
E da, jos jedna jako bitna stvar: Ako je u TPrivileges definisano do 8 privilegija onda TValuedPrivileges.Value je tipa bajt, preko 8 je Integer, posto se clanovi seta definisu u designtime-u Delphi pri kompajliranju odredjuje najmanji tip koji je potreban za cuvanje.
Malo sam se raspisao ali nema veze, vezbam slepo kucanje na koristan nacin...
Trebao sam ici u pravno-birotehnicku, za 2 meseca bi bio profi a ovako i posle 2 godine vezbanja i dalje nemam pojma...
Pozdrav!
[Ovu poruku je menjao _v!rus_ dana 16.11.2005. u 23:49 GMT+1]