Gestion de droits minimaliste en PHP

J’ai été amené à développer un mini CMS avec niveaux d’accès différentiés.
Le but: n’autoriser l’accès à certains modules qu’à certaines personnes.

J’ai opté par un système assez simple basé sur les sommes de puissances de 2.

On attribue à chaque module une puissance de 2
On additionne pour chaque utilisateur les sommes des puissances de deux pour les modules autorisés.
Une conversion de la somme en binaire suivi d’un reverse de la chaine obtenue donne une série de 0 et 1 qui dans l’ordre donnent les accès aux modules sous forme de boolean (0= accès refusé , 1 accès autorisé).

Un petit exemple :

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
27
28
29
<html>
<head>
</head>
<body>
<?php
$valdroits=array("compta"=>1,"fournitures"=>2,"documents"=>4,"admin"=>8);
$droits=1+4; //$valdroits["fournitures"]+$valdroits["admin"];
$booldroits= strrev((string)(decbin($droits)));

$menu=array();
$i=-1;
foreach($valdroits as $rub=>$val){
    $i++;
    $menu[$rub]=isset($booldroits[$i])?$booldroits[$i]:0;
}


echo nl2br(print_r($menu,true));

echo "<br/>";

foreach($menu as $rub=>$val){
   
 if($val){ echo 'vous avez accès au menu '.$rub."<br/>";}
}

?>
</body>
</html>

Explications:

1
$valdroits=array("compta"=>1,"fournitures"=>2,"documents"=>4,"admin"=>8);

ici chacun des modules se voit attribuer une puissance de 2 (attention pas de doublon !)

Pour un utilisateur on somme les puissances de deux des modules autorisés

1
$droits=$valdroits["fournitures"]+$valdroits["admin"]; // 1+4

ici les modules compta et documents

Et voici le conversion magique :

1
$booldroits= strrev((string)(decbin($droits)));

qui nous retourne la chaine « 1010 »
que l’on peut décomposer comme suit:
compta 1 => true
fournitures 0 => false
documents 1 => true
admin 0 => false

Par commodité on peut associer à chaque module les boolean d’accès pour l’utilisateur:

1
2
3
4
5
6
$menu=array();
$i=-1;
foreach($valdroits as $rub=>$val){
    $i++;
    $menu[$rub]=isset($booldroits[$i])?$booldroits[$i]:0;
}

ce qui nous donne

$menu[« compta »]=>1
$menu[« fournitures »]=>0
$menu[« documents »]=>1
$menu[« admin »]=>0;

il suffit ensuite de tester pour avoir si le module est autorisé on non

1
2
3
4
foreach($menu as $rub=>$val){
   
 if($val){ echo 'vous avez accès au menu '.$rub."<br/>";}
}

Avantages :
Pas besoin de table, gestion simple des groupes : un groupe = un integer, la même somme donnant les mêmes accès.
Ajout aisé de module : il suffit d’ajouter une puissance de 2

Désavantage :
Devient vite fouillis lorsque l’on a beaucoup de modules

Une réflexion au sujet de « Gestion de droits minimaliste en PHP »

Laisser un commentaire