Slimste manier ...
Ik bedoel dus Admin, ..., Normal User.
(Tot nu toe deed ik dit met cijfers, 0 in de database is Normal User en 5 is bv Admin (met die andere cijfers er nog tussen) en dan op de page checken :))
Ik denk dat dit het makkelijkste is. Ik zal niet weten hoe je het anders wilt doen :)
op deze manier bedoel ik dan:
(voorbeeld van unix)
1 uitvoeren
2 schrijven
4 lezen
en dat dan optellen en je weet welke rechten je hebt :)
Ik denk dat ik het maar gewoon zo hou :)
Ik ruik wederom een tutorial.
Ik was bezig met een iets uitgebreidere versie van wat rick zegt. Alleen met de gedachten erachter. Helaas gong dr iets mis, en is het voor tot in de eeuwigheid verdwenen.
De methode van de unix permissies werkt met machten van 2.
De volgende functie ilcht hier aan ten grondslag:
0: uitvoeren
1: schrijven
2: lezen.
Het probleem is om voor elke combinatie van permissies een getal te hebben.
Hiervoor gebruik je machten van 2: 2^x. De lol hiervan is dat van de som van 2^x unieke getallen pleverd, zoals bij de unix permissies. Elke opvolgende uitkomst van de vergelijking y=2^x is groter dan de som van de vorige uitkomsten. Dit is temelijk essentieel: hierdoor kan je per x vaststellen of het er wel of niet inzit.
dus, een array, je begint met je onderdelen te nummeren:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$permissies[0] = "Lezen";
$permissies[1] = "Leden beheren";
$permissies[2] = "Nieuwsbrief beheren";
$permissies[3] = "Nieuws beheren";
$permissies[4] = "Forum beheren";
?>
$permissies[0] = "Lezen";
$permissies[1] = "Leden beheren";
$permissies[2] = "Nieuwsbrief beheren";
$permissies[3] = "Nieuws beheren";
$permissies[4] = "Forum beheren";
?>
Voetnoot: Ik ga er vanuit dat je dit oplopende getallen houd, zonder gaten is wel zo netjes.
Wanneer we elk slice nummer $x noemen, en het nummer dat voor die slice staat wordt 2^$x.
Dan wordt dus
lezen: 2^0: 1
leden beheren: 2^1: 2
nieuwsbrief beheren: 2^2: 4
nieuws beheren: 2^3 = 8
forum beheren: 2^4 = 16
etc.
Dit leverd een a la chmod permissies nummer op wanneer je deze getallen bij elkaar opteld:
kortom: iemand die mag lezen, leden beheren en forum beheren heeft een permissiegetal van 1+2+16 = 19.
De vraag blijft: hoe check je wie welke permissies heeft? Hoe werkt het in de praktijk?
Je moet dus controleren of elke macht 2^x getal in de som van machten zit. Kans is dat de laagste macht er altijd in zit. Maar wanneer je vanaf de hoogste af kijkt, en wanneer de hoogste macht erin zit, deze eraf haalt, kan je per macht kijken of deze wel of niet in de som van machten zit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
function checkpermissies ($pgetal) {
//argument pgetal: het getal met de som van de permissies
$flags = array();
// array met bestaande flags
for ($i = count($permissies) -1; $i >= 0; $i--;) {
if (($pgetal - (2**$i)) >= 0) {
// is de som van de machten minus de grootste macht groter of gelijk aan 0? Dan zit deze erin!
// echo "$permissies[$i] zit in de machten<br>";
$flags[] = $i;
$pgetal = $pgetal - (2**$i);
}
}
return $flags;
}
?>
function checkpermissies ($pgetal) {
//argument pgetal: het getal met de som van de permissies
$flags = array();
// array met bestaande flags
for ($i = count($permissies) -1; $i >= 0; $i--;) {
if (($pgetal - (2**$i)) >= 0) {
// is de som van de machten minus de grootste macht groter of gelijk aan 0? Dan zit deze erin!
// echo "$permissies[$i] zit in de machten<br>";
$flags[] = $i;
$pgetal = $pgetal - (2**$i);
}
}
return $flags;
}
?>
Et voila! Een array met de nummers van de onderdelen (in dit geval, van de 0 t/m 4).
De wiskundige achtergrond is even het ingewikkeldste te doorgronden, maar niet te moeilijk.
Vervolgens, één functie, en je hebt je eigen scalable flag systeem.
Grtz,
Arend
Gewijzigd op 29/05/2004 00:17:00 door Arend a
Hmm.. ben ik de denige die dit best interessant vind? :)
Ik probeer het nog te snappen :P
Quote:
nee, ik had je reply alleen niet gelezen ;)Hmm.. ben ik de denige die dit best interessant vind? :)
de permissies: 766 bijvoorbeeld.
het permissiegetal 7:
Eerst de macht van het hoogste getal (4 = 2^2 = lezen ) af te trekken: dit leverd geen negatief getal op; kortom, de gebruiker mag lezen.
Vervolgens hebben we 3 over, en gaan we voor de overige getallen kijken of ze er in zitten:
het hoogste getal na 4 is 2 en staat voor schrijven., (2^1). 3-1 = 1, dit is dus ook positief, dus de gebruiker mag lezen en schrijven.
HEt zelfde trucje geld voor uitvoeren (0), 2^0 =1 en ook dit leverd geen negatief getal op, en mag dus lezen, schrijven en uitvoeren.
Grmbl. De wiskunde wordt hevig ondergewaardeerd in deze fori.
1 -> visitor
2 -> user
3 -> admin
veel makkelijker is :)
rechten per nivo. maar bij arends manier kan je alle rechten apart instellen
Dit topic staat wel al bij me favorieten :)