Bonjour,
Malgré par mal de lecture de différents sujets et tutos, souvent anciens et pas forcément adaptés à ma version de ZF, j'ai du mal à comprendre comment implémenter Zend_Acl correctement dans mon projet.
J'ai modélisé les utilisateurs, leur type (rôle au sens ACL) et même les fonctions de l'application (ressource au sens ACL) dans la BDD selon ce modèle :
utilisateur -1,1----Typer----0,n- type_utilisateur -0,n----Accéder----0,n- fonction
Le rôle d'un utilisateur est donc matérialisé par une clé étrangère faisant référence à son type et les fonctions auxquelles il a accès sont matérialisées par des clés étrangères dans la table associative issue de l'association "Accéder".
Pour le moment, j'ai créé une classe dans le répertoire "library" de mon application qui récupère tout en BDD :
J'avais aussi fait, avant de commencer à étudier les ACL, ce contrôleur d'authentification, à partir d'un tuto :
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 <?php /** * library/acl.php * Classe d'initialisation du contrôle d'accès aux fonctions de l'application * @author Philippe Leménager * @version 1.0 - 2011-04-07 */ class Acl extends Zend_Acl { public function __construct() { // Chargement des rôles $typeuser = new Application_Model_DbTable_Typeutilisateur(); $tabroles = $typeuser->fetchAll(); foreach($tabroles as $role) { $this->addRole(new Zend_Acl_Role($role['tu_libelle'])); } // Chargement des ressources $fonction = new Application_Model_DbTable_Fonction(); $tabfonctions = $fonction->fetchAll(); foreach($tabfonctions as $ressource) { $this->addResource(new Zend_Acl_Resource($ressource['fct_libelle'])); } // Attribution des droits $tabdroits = $typeuser->listeDroits(); foreach($tabdroits as $droit) { $this->allow($droit['role'], $droit['ressource']); } } }
=> On y voit que, pour le moment, je récupère le libellé du type d'utilisateur en clair afin d'orienter l'utilisateur sur sa page d'accueil, grâce à un simple switch.
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 <?php /** * application/controllers/AuthController.php * Contrôleur de la page d'authentification * @author plemenager * @version 1.0 - 2011-04-07 */ class AuthController extends Zend_Controller_Action { public function init() { } /** * auth/index * Traite la page de connection */ public function indexAction() { $form = new Application_Form_Login(); $this->view->title = 'Connexion aux stages master'; $request = $this->getRequest(); if ($request->isPost()) { if ($form->isValid($request->getPost())) { if ($this->_process($form->getValues())) { /* * Authentification réussie, * redirection vers la page d'accueil selon le type de l'utilisateur */ $values = $form->getValues(); $login = $values['username']; $utilisateur = new Application_Model_DbTable_Utilisateur; $result = $utilisateur->getTypeUtilisateur($login); $typeUtilisateur = $result['tu_libelle']; switch ($typeUtilisateur) { case 'Étudiant'; $this->_helper->redirector('index', 'accueiletudiant' ); break; case 'Gestionnaire' : $this->_helper->redirector('index', 'accueilgestionnaire'); break; case 'Administrateur' : $this->_helper->redirector('index', 'accueilgestionnaire' ); break; } // fin switch ($typeUtilisateur)*/ } // Fin if ($this->_process($form->getValues())) } // if ($form->isValid($request->getPost())) } // Fin if ($request->isPost()) $this->view->form = $form; } // Fin public function indexAction() protected function _process($values) { // Get our authentication adapter and check credentials $adapter = $this->_getAuthAdapter(); $adapter->setIdentity($values['username']); $adapter->setCredential($values['password']); $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($adapter); if ($result->isValid()) { $user = $adapter->getResultRowObject(); unset($user->uti_mot_passe); // Ne pas stocker le mdp en session ! $auth->getStorage()->write($user); return true; } return false; } protected function _getAuthAdapter() { $dbAdapter = Zend_Db_Table::getDefaultAdapter(); $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authAdapter->setTableName('th_utilisateur_uti') ->setIdentityColumn('uti_login') ->setCredentialColumn('uti_mot_passe') ->setCredentialTreatment('MD5(?)'); return $authAdapter; } public function logoutAction() { Zend_Auth::getInstance()->clearIdentity(); $this->_helper->redirector('index'); // back to login page } }
Enfin, toujours avant l'étude des ACL, j'avais fait ce genre de truc dans les contrôleurs pour empêcher un utilisateur d'arriver sur une page directement par une URL sans passer par l'authentification :
Mais je trouve ça lourd de répéter ce code dans chaque contrôleur. De plus, ça ne vérifie pas le rôle de l'utilisateur.
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 class AccueiletudiantController extends Zend_Controller_Action { // TODO à revoir avec système ACL protected $auth; // Identification de l'étudiant connecté. public function init() { // Récupération de l'étudiant connecté $this->auth = Zend_Auth::getInstance(); if (! $this->auth->hasIdentity()) { // Si session perdue, on redirige vers la page de connexion $this->_helper->redirector('index', 'auth'); } // Ajout du helper d'action JQuery autoComplete Zend_Controller_Action_HelperBroker::addHelper( new ZendX_JQuery_Controller_Action_Helper_AutoComplete() ); } // Fin public function init()
J'ai vu à plusieurs endroits qu'il faut créer un plugin mais, pour commencer, où le mettre dans l'arborescence du projet ? Dans "library" ? Dans "controllers" ? Dans un sous-répertoire "plugins" de "controllers" ? Ailleurs ?
Ensuite, je n'ai pas compris comment on "lance" ce plugin. Par un bout de code dans le Bootstrap.php ? Dans configs/Application.ini ?
Bref, un tuto complet et actualisé à ZF 1.11 serait utile.
Partager