webForumDet fria alternativet

Behörighetsnivåer

7 svar · 405 visningar · startad av AG

AGMedlem sedan mars 20001 266 inlägg
#1

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
#2

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
#3

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
#4

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
#5

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
#6

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
#7

Ä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
#8

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 :)

128 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)