AGMedlem sedan mars 20001 266 inlägg Tänkte bygga upp ett adminsystem där olika användare har olika behörigheter.
Tänkte man kunde bygga upp detta med en sträng ex, 1010 där 1 = behörighet och 0 = ej behörighet. Där skulle man sedan kunna använda substring för att få ut vad en användare har behörighet till.
Dock fick jag detta svar på ett annat forum:
I've done similar things in the past when I needed a custom role-based authentication module. However, instead of substrings you should store the values as ints and use binary logic.
Each role key is represented by a bit:
watch = 1, modify = 2, delete = 4, create = 8.
And each user has a key defining their permissions:
int userKey = 6; // (0110 - modify & delete)
Now the following applies:
(roleKey | roleKey) combines permissions
(userKey & roleKey) checks permissions
(userKey | roleKey) adds permissions
(userKey & !roleKey) deletes permissions
--Jon
Dock fattar jag inte riktigt vad denna Jon menar.
Någon som förklara?
tack
Andreas
PeWMedlem sedan juni 200010 432 inlägg 6 är detsamma som 0110, binärt sett. Om man tar exempelvis 6 AND 1 (0001) så får man 0000 som resultat. Medans 6 OR 1 blir 7 (0111) som resultat. Så 2 & 4 => 0010 & 0100 = 0000, vilket då kan sättas in som 6 - (2 & 4) = 6 => 6 - 0 = 6. Bör väl då innebära att man sen kan kolla om userKey stämmer med roleKey genom att köra AND.
PhorpherMedlem sedan feb. 20002 300 inlägg Om du hållit på med t.ex. chmod i Unix så borde du veta vad det handlar om.
De fyra olika behörigheterna som jon visar har värdena 1, 2, 4 och 8. Ser du ett mönster?
READ: 1 är binärt 0001
MODIFY: 2 är binärt 0010
DELETE: 4 är binärt 0100
CREATE: 8 är binärt 1000
Om du vill att en användare ska få behörighet att läsa och ändra använder du den logiska OR-operatorn:
int userPermission = READ | MODIFY;
userPermission får värdet av READ och MODIFY kombinerat vilket är 3:
0001 | 0010 = 0011 = 3
För att kolla om en användare har rättigheten MODIFY:
if(userPermission & MODIFY)
...
0011 & 0010 = 0010 = 2 = MODIFY! Användaren får ändra.
Kanske ger dig en hint om hur det fungerar. :i
spangoMedlem sedan juni 20008 205 inlägg Re: Behörighetsnivåer
Jon skrev:
(userKey & !roleKey) deletes permissions
Man ska inte använda ! när man arbetar med bitar, man ska använda bitvis komplement, ~. Alltså, om du har en variabel perms och vill ta bort rättigheten att ändra, skriver du:
perms = perms & ~MODIFY;
// eller kortare...
perms &= ~MODIFY;
spangoMedlem sedan juni 20008 205 inlägg
Phorpher skrev:
För att kolla om en användare har rättigheten MODIFY:
if(userPermission & MODIFY)
...
0011 & 0010 = 0010 = 2 = MODIFY! Användaren får ändra.
Fast eftersom det är Java måste man skriva
if ((userPermission & MODIFY) == MODIFY)
eftersom man inte kan använda en int (eller long eller bla bla bla) som villkor :)
PhorpherMedlem sedan feb. 20002 300 inlägg
spango skrev:
Phorpher skrev:
För att kolla om en användare har rättigheten MODIFY:
if(userPermission & MODIFY)
...
0011 & 0010 = 0010 = 2 = MODIFY! Användaren får ändra.
Fast eftersom det är Java måste man skriva
if ((userPermission & MODIFY) == MODIFY)
eftersom man inte kan använda en int (eller long eller bla bla bla) som villkor :)
Det är helt korrekt! Jag satt faktiskt och funderade på hur det var jag gjorde i Java sist men kom inte ihåg. :bire
För övrigt är det här ett riktigt, riktigt snyggt sätt att hantera flaggor på enligt mig.
AGMedlem sedan mars 20001 266 inlägg Är detta ett enkelt och bra sätt att sedan utöka med mer och mer sidor, eller begränsar man sig något?
Andreas
spangoMedlem sedan juni 20008 205 inlägg Den enda begränsningen är antalet bitar. I en int har du 32, i en long 64, så om du tänker ha fler än 64 olika roller borde du tänka om, men jag skulle kanske misstänka att det inte behövs :)