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
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.
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:
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 :)
261 ms totalt · 4 externa anrop · v20260731065814-full.5386d3bf