J'ai mis en place un système d'identification d'utilisateurs en suivant le tuto :
http://r-benyacoub.developpez.com/tu...ork/zend-auth/
Maintenant j'essaie de gérer des droits, donc je m'interresse à Zend_Acl.
Les informations que l'on trouve sur le net concernant l'utilisation de Zend_Acl m'embrouillent un peu car souvent ce sont des méthode différentes qui sont utilisées.
Du coup je viens la pour exposer ma situation, si ça parle à quelqu'un qui pourrait m'expliquer et me permettre d'avancer...
Sur le site web, il faut dans tous les cas être identifié pour accéder a n'importe quelle page excepté la page de login.
J'ai donc mis en place comme expliqué dans le tuto Zend_Auth cité plus haut :
Et puis dans mon IndexController, j'ai rajouté :
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 <?php class AuthController extends Zend_Controller_Action { function init() { $this->initView(); $this->view->baseUrl = $this->_request->getBaseUrl(); } function indexAction() { $this->_redirect('/'); } function loginAction() { $this->view->message = ''; if($this->_request->isPost()){ Zend_Loader::loadClass('Zend_Filter_StripTags'); $filtre = new Zend_Filter_StripTags(); echo $this->_request->getPost('username'); $username = $filtre->filter($this->_request->getPost('username')); $password = $filtre->filter($this->_request->getPost('password')); if (empty($username)){ $this->view->message = "Nom d'utilisateur obligatoire"; }else{ Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable'); $db = Zend_registry::get('db'); $authAdapter = new Zend_Auth_Adapter_DbTable($db); $authAdapter->setTableName('utilisateur'); $authAdapter->setIdentityColumn('nom'); $authAdapter->setCredentialColumn('motdepasse'); $authAdapter->setIdentity($username); $authAdapter->setCredential($password); $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()){ $data = $authAdapter->getResultRowObject(null,'motdepasse'); $auth->getStorage()->write($data); $this->_redirect('/'); }else{ $this->view->message = 'L\'identification a échouée'; } } } $this->view->title = "Authentification"; $this->render(); } function logoutAction() { Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/'); } } ?>
Ca, ca marche, il faut etre un utilisateur existant dans la base de donnée pour accèder au site.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 function preDispatch() { $auth = Zend_Auth::getInstance(); if(!$auth->hasIdentity()){ $this->_redirect('auth/login'); } }
Maintenant, si j'essaie de gérer les droits :
Je me suis inspiré de code trouvé sur le net, j'ai rajouté dans mon bootstrap
Donc :
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 //------------------------------------------------------------- // creer le moteur d'ACL Zend_Loader::loadClass("Zend_Acl"); Zend_Loader::loadClass("Zend_Acl_Role"); Zend_Loader::loadClass("Zend_Acl_Resource"); $acl = new Zend_Acl(); // menu utilisateur--- $acl->add(new Zend_Acl_Resource('Accueil')); $acl->add(new Zend_Acl_Resource('Dossier')); $acl->add(new Zend_Acl_Resource('Compte')); // menu administrateur--- $acl->add(new Zend_Acl_Resource('GestionUtilisateur')); $acl->addRole(new Zend_Acl_Role('utilisateur')); $acl->addRole(new Zend_Acl_Role('administrateur'),'utilisateur'); $acl->allow('utilisateur', 'Accueil'); $acl->allow('utilisateur', 'Dossier'); $acl->allow('utilisateur', 'Compte'); $acl->allow('administrateur', 'GestionUtilisateur'); Zend_Registry::set("ACL",$acl); //-------------------------------------------------------------
- Je définie mes ressources
- Je définie mes rôles : utilisateur, administrateur (qui hérite de utilisateur)
- Je stocke ces infos dans le registre
Maintenant, quelques questions pour personnes qui ont déjà utilisé Acl :
1) Comment je fais pour savoir si quelqu'un est utilisateur ou gestionnaire ? Je stocke un code dans la table des utilisateurs et je le recupère en même temps que l'authentification ? ensuite un fois que j'ai son rôle je rajoute du code dans le predispatch afin de confirmer un accés ou non à une ressources ? (des exemple de code seraient les bienvenues)
2) La, je ne gère que 2 rôles utilisateur et gestionnaire. Imaginons que je veuille gérer les accès plus finement et que chaque utilisateur ait des droits spécifiques(un programme de gestion permettrait de les gérer) : Est il conseillé de stocker un profil par utilisateur, ou bien c'est trop lourd à gérer et il vaut mieux définir 4/5 profils d'utilisateur qui conviendrons en gros à tous les utilisateurs ?
Partager