Ik doe al een tijdje de userniveaus op dezelfde wijze 'berekenen' maar voor mijn nieuwe site ben ik opzoek naar de beste manier. Graag wil ik hierover advies.
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 :))
je kan het eventueel ook op dezelfde manier doen als de unix rechten, maar dan krijg je op een gegeven moment wel een erg hoog getal
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 :)
Edit: vergeten php stukje af te sluiten
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:
<?
$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.
<?
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.
Je maakt in principe een getal, waar je om het chmod voorbeeld eens te nemen steeds het hoogste getal probeert af te halen:
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.