Bitwise rechten systeem
Ik ben nu bezig met een rechten systeem. Ik heb er al het een en ander over opgezocht en kwam bij de volgende uit:
http://www.phphulp.nl/php/tutorial/beveiliging/bitwise-rechten-systeem/633/
Dit is een bitwise rechtensysteem. Dit wil ik eigenlijk toe gaan passen in combinatie met rollen.
Ik heb hier eigenlijk drie vragen over:
- Als ik in een database gewoon het getal zet van de rechten van de gebruiker, hoe kan ik dan terug rekenen naar wat de verschillende rechten zijn? Of is het het makkelijkst om dit gewoon in een tabel te zetten?
- Als ik met rollen ga werken wil ik het volgende. Personen krijgen een rol en aan de hand van deze rollen krijgen ze de rechten om ook klanten van personen te zien die een lagere rol hebben dan zijzelf.
Bijvoorbeeld:
Een manager kan zijn eigen klanten zien en de klanten van de personen die een rol hebben die lager is dan die van hemzelf. Maar deze manager kan geen klanten zien van de directie omdat deze een hogere rol heeft dan de manager.
Dit is toch het makkelijkste op te lossen d.m.v. elke gebruiker een rol toe te kennen en dan via het bitwise rechtensystem een recht aan te maken en via dit recht te zeggen: deze persoon mag klanten zien die lager zijn dan hijzelf?
- Klopt het ook dat dit systeem vrij statisch is? Dus dat er niet zomaar een rol of recht toegevoegd kan worden? Want als er een rol of recht toegevoegd wordt zal dit toch altijd verwerkt moeten worden in de php code?
Ik hoop dat het duidelijk is en dat jullie mij kunnen helpen ;)
Alvast bedankt!
Iemand?
Gaat dit alleen over inkijken? Of ook over read/write/edit/delete etcetera?
Maar het probleem met klanten inzien van personen die een lagere rol hebben dan jezelf is alleen zo op te lossen denk ik toch?
En hoe kan ik het makkelijkste die rechten overzichtelijk maken? Als je bijv. 1 = lezen; 2 = wijzigen; 4 = verwijderen hebt en iemand heeft de rechten 6 is het dan het makkelijkste uit te lezen door een koppeltabel aan te maken waar dan instaat:
gebruikerid | rechtid
1 | 2
1 | 3
of is er een makkelijkere manier?
1 = lezen; 2 = wijzigen; 4 = verwijderen (trouwens niet logisch bedacht want hoe kan je wijzigen zonder dat je het kan lezen)
Maar:
6 & 4 => 4 dus recht 4
6 & 1 => 0 geen recht 1
Dus van die 6 het hoogste getal aftrekken wat eraf kan en dan telkens doen totdat ik de rechten overhoudt?
Ik denk wel dat je die in 1 veld kunt zetten.
Wat logica betreft, heb je ook heel leuke wapens.
Werk met defines, dan ziet het er heel leesbaar uit.
Ik zal eens zien of ik een klein voorbeeld kan tonen
Graag want ik vind het een moeilijk onderwerp. Dus ik weet niet precies wat je bedoelt met flags :p
Rolf - op 23/03/2012 13:56:46:
Dus van die 6 het hoogste getal aftrekken wat eraf kan en dan telkens doen totdat ik de rechten overhoudt?
Nee, ik doe een (bitwise) AND.
Dus er komt een pagina waar de details van de gebruiker staan. Dus ook welke rechten hij/zij al heeft. Hoe kan ik deze het makkelijkste uitlezen? Mijn eerste gedachte was om dit via een koppeltabel te doen maar dit moet makkelijker kunnen lijkt me?
Snap je wat ik bedoel?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
// de defines
define ('LOGGED_IN', bindec ('0001'));
define ('CONTRIBUTOR', bindec ('0010'));
define ('MODERATOR', bindec ('0100'));
define ('ADMIN', bindec ('1000'));
// volgende gegevens zouden normaal in een db staan
$rights_John = bindec ('1000');
$rights_Blogger = bindec ('0011');
// indien enkel moderatoren (of hoger) toelating hebben ...
if ($rights_John >= MODERATOR) {
echo 'John is moderator or more<br/>';
}
// specifiek recht testen. Zijn die jongens Contributer?
if ($rights_John & CONTRIBUTOR) { // bitwise AND
echo 'John is contributor<br/>';
}
if ($rights_Blogger & CONTRIBUTOR) { // bitwise AND
echo 'Blogger is contributor<br/>';
}
?>
// de defines
define ('LOGGED_IN', bindec ('0001'));
define ('CONTRIBUTOR', bindec ('0010'));
define ('MODERATOR', bindec ('0100'));
define ('ADMIN', bindec ('1000'));
// volgende gegevens zouden normaal in een db staan
$rights_John = bindec ('1000');
$rights_Blogger = bindec ('0011');
// indien enkel moderatoren (of hoger) toelating hebben ...
if ($rights_John >= MODERATOR) {
echo 'John is moderator or more<br/>';
}
// specifiek recht testen. Zijn die jongens Contributer?
if ($rights_John & CONTRIBUTOR) { // bitwise AND
echo 'John is contributor<br/>';
}
if ($rights_Blogger & CONTRIBUTOR) { // bitwise AND
echo 'Blogger is contributor<br/>';
}
?>
Met een bitwise AND kan je dus direct controleren of de gebruiker die ene vlag bevat.
Indien je nog wat logica zet in de volgorde van de vlaggen, kan je simpel met < en > beginnen rekenen.
Wanneer je met defines werkt, maak je de boel nog eens leesbaar.
Tja ... het is allemaal een kwestie van binair rekenen. Wat lastig om het verhaal van de vlaggen uit te leggen ...
Bedenk vooral dat je een systeem hebt waarbij de ene waarde de andere niet in de weg zit.
Je kan elk onderdeel op 1 of 0 zetten.
Google een "dip switch". Het gaat om zo'n logica.
Gewijzigd op 23/03/2012 16:57:12 door Kris Peeters