Bonjour à tous,

je recherche au travers de ce post vos divers point de vue et conseils sur la façon de gérer des droits d'accès à une application.
La classe présentée ci dessous me permet :
- De donner des droits au niveau des groupes utilisateurs
- De donner des droits au niveau utilisateurs

Ainsi il est possible d'interdire tout le groupe modérateur de supprimer des messages mais de laisser un utilisateur spécifique le faire malgré son appartenance à ce groupe.
La classe est également utilisable dans un cas ou il n'y aurai pas de groupe mais juste des utilisateurs.

Ma gestion des droits reposes sur une bdd avec :
- Une table droits regroupant tous les droits
- une table droits_groupe : associant les droits au groupe (si le couple idGroupe/idDroit existe , alors le groupe est autorisé sur ce droit)
- une table droits_user ; même principe mais avec les utilisateurs.

Généralement je génère l'object ACL à la connection en recherchant toutes les droits (ressources) puis les droits spécifiques pour les groupes et les utilisateurs. L'objet est ensuite sérialiser via sleep puis trimballer en session. Donc en principe je ne fait qu'une seule fois 3 requêtes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
class Auth_ACL
{
	/**
	 * Etat des ressources pour l'utilisateur
	 * @var array
	 * @access private
	 */
	private $userRessources;
 
	/**
	 * Etat des ressources pour le groupe
	 * @var array
	 * @access private
	 */
	private $groupRessources;
 
	/**
	 * L'utilisateur à t'il tous les droits
	 * @var boolean
	 * @access private
	 */
	private $isGod;
 
	/**
	 * Constructeur
	 * @param boolean $god
	 */
	public function __construct($god = false)
	{
		$this->userRessources 	= array();
		$this->groupRessources	= array();
		$this->isGod			= $god;
	}
 
	/**
	 * Ajoute les ressources disponibles
	 * @param mixed $ressources Tableau de ressources ou ressource seule
	 * @return void
	 */
	public function addRessource($ressources)
	{
		if(is_array($ressources))
		{
			foreach($ressources as $ressource)
			{
				$this->groupRessources[$ressource] = false;
				$this->userRessources[$ressource]  = false;
			}
		}
		else
		{
			$this->groupRessources[$ressources] = false;
			$this->userRessources[$ressources]  = false;
		}
	}
 
	/**
	 * Autorise (ou non) le groupe courant sur la ressource spécifiée
	 * @param mixed $ressources Tableau de ressources ou ressource seule
	 * @param boolean $isAllowed Autorise ou non accès à la ressources
	 * @return void
	 */
	public function allowGroup($ressources,$isAllowed)
	{
		if(is_array($ressources))
		{
			foreach($ressources as $ressource)
				$this->groupRessources[$ressource] = $isAllowed;
		}
		else
		{
			$this->groupRessources[$ressources] = $isAllowed;
		}
	}
 
	/**
	 * Autorise (ou non) l'utilisateur courant sur la ressource spécifiée
	 * @param mixed $ressources Tableau de ressources ou ressource seule
	 * @param boolean $isAllowed Autorise ou non accès à la ressources
	 * @return void
	 */
	public function allowUser($ressources,$isAllowed)
	{
		if(is_array($ressources))
		{
			foreach($ressources as $ressource)
				$this->userRessources[$ressource] = $isAllowed;
		}
		else
		{
			$this->userRessources[$ressources] = $isAllowed;
		}
	}
 
	/**
	 * Vérifie si l'accès à la ressource est autorisé.
	 * Un accès est autorisé si le groupe et/ou l'utilisateur est autorisé
	 * @param string $ressource Ressource à vérifier
	 * @return boolean
	 */
	public function isAllowed($ressource)
	{
		if($this->isGod)
			return true;
		if(isset($this->groupRessources[$ressource]))
		{
			if($this->groupRessources[$ressource])
				return true;
			elseif($this->groupRessources[$ressource] | $this->userRessources[$ressource])
				return true;
			else
				return false;
		}
		else
		{
			throw new Util_ExceptionHandler('Ressource inconnue : '.$ressource.'<br />');
		}
	}
 
	public function __sleep()
	{
		return array('isGod','groupRessources','userRessources');
	}
}
Une fois les ressource chargée il ne me reste plus qu'a tester les droits quand j'en ai besoin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
if($ACL->isAllowed('supprimer_message')
	echo 'OK';
else
	echo 'PAS OK';
Ma question est donc qu'en pensez vous ? Comment gérer vous les différents droits sur vos sites ?