Page 1 sur 1

Gestion de droits, binary style

Posté : 19 avr. 2011, 16:58
par AoSiX
Bonjour,

Je souhaite gérer des droits pour les utilisateur sur la partie administration d'un site. Pour cela, la solution la plus simple - mais loin d'être la bonne selon moi - serait de créer dans ma base une table du style ( entre parenthèse = exemple de valeur)

User_ID ( xxx ) - Module ( news ) - Action ( create) - Droit ( 0/1 )

Cependant, je me dit qu'il droit être possible de créer un système ou ...

Module1 : Creation = 1
Module1 : Edition = 2
Module2 : Creation = 4
Module2 : Edition = 5

Mais je ne sais pas de quelle manière faire en sorte qu'on puisse créer des droits du genre "Module1:Creation + Module1:Edition", ou plus complexe comme "Module1:Edition + Module2 : Creation + Module3:Edition" sans avoir à créer une règle pour chaque nouvelle association ( surtout que si le nombre de module & d'action grossi, ce sera une panassé de nouvelle ligne pour recréer les nouveaux calculs ) . Il me semble avoir vu ce genre de systeme il y a un moment, ou tout cela été géré avec l'opérateur binaire "|", mais je n'arrive pas à remettre la main sur la logique :/

J’espère que vous pourrez m'aider dans ma quête à la recherche d'un système de gestion de droit complet, dynamique, et qui ne nécessite pas trop de maintenance ! ( je suis sur que c'est possible ... :) )

Amicalement,
Julien

Re: Gestion de droits, binary style

Posté : 19 avr. 2011, 17:11
par nhachet
Salut,

tu peux chercher du coté des ACL (Access Control List). Plusieurs frameworks utilisent cette notion (par exemple Cake ou Zend).

Bon courage,
Nicolas

Re: Gestion de droits, binary style

Posté : 20 avr. 2011, 10:34
par AoSiX
Bonjour,

j'ai enfin trouvé ce que je cherchais !

Voilà un exemple au cas ou ça interesse ....
<?php
 
define ('CONSULER_ARTICLES',    0x01);
define ('ECRIRE_ARTICLE',  0x02);
define ('PUBLIER_ARTICLE', 0x04);
define('FAIRE_DES_CONNERIES',0x08);
 
// ajout de droits
$permissions= 0;
$permissions |= CONSULER_ARTICLES;
$permissions |= ECRIRE_ARTICLE;  
$permissions |= FAIRE_DES_CONNERIES;
// on peut également écrire $permissions |= CONSULER_ARTICLES | ECRIRE_ARTICLE | FAIRE_DES_CONNERIES;

// retrait de droit ... on sait jamais si vous voulez lui retirer en cours de route :)
$permissions &= ~(ECRIRE_ARTICLE | FAIRE_DES_CONNERIES);
// on assemble les droits avec | , on les inverses avec ~ , puis ont les enleves du membre en gardant les autres avec &
 
 
// test de droits ; je rajoute intval car il arrive que permission soit de type string, notamment si il vient d'une BDD
if (intval($permission) & PUBLIER_ARTICLE)
{
        echo 'Vous pouvez publier vos articles...';
	exit;
}

?>
Pour ce qui est des valeurs des droits, ce sont des puissantes de deux. Le choix à été fait de les mettre en hexa plutôt qu'en décimal, simplement car la suite hexa est simple de retenir, ce sont toujours les mêmes chiffres auxquel on ajoute des 0 à la fin...

Code : Tout sélectionner

0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80 0x100 0x200 0x400 0x800
En décimal ça donne : 1, 2 , 4, 8, 16, 32, 64, 128, 256, 512 ....
Et comme dirait Flanders, voili voilou les voisinous : )