[Zend_Acl] Acl Auth fonctionnement général
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 :
Code:
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('/');
}
}
?> |
Et puis dans mon IndexController, j'ai rajouté :
Code:
1 2 3 4 5 6 7
| function preDispatch()
{
$auth = Zend_Auth::getInstance();
if(!$auth->hasIdentity()){
$this->_redirect('auth/login');
}
} |
Ca, ca marche, il faut etre un utilisateur existant dans la base de donnée pour accèder au site.
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
Code:
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);
//------------------------------------------------------------- |
Donc :
- 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 ?