Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je me replonge sur les acl et auth : apparemment je ne suis pas le seul, vue le nombre de message à ce sujet.
Comme tout le monde je m'inspire d'un code qui, après l'avoir adapté à mon pb très basique, fonctionne plus ou moins. Cependant, je ne comprends pas certaines choses et je suis preneur d'explication.
//$role = $this->_auth->getIdentity()->getUser()->role;
Je ne pige pas dans ce code, d'ou sort getUser() et ->role. Chez moi, getIdentity() me retourne un objet représentant une ligne de ma table renseigné via $this->authAdapter->setTableName('users'); J'y accede donc via $identity = $this->_auth->getIdentity(); et $role = $identity->ROLE;. En tous les cas, je n'ai pas de fonction getUser() si je fais un print_r($identity).
Ensuite, voici mon code :
private $_auth; private $_acl; private $_noauth = array('module' =>'default', 'controller' => 'login', 'action' => 'index'); private $_noacl = array('module' => 'default', 'controller' => 'index', 'action' => 'index'); ........ $controller = $request->getControllerName(); $action = $request->getActionName(); $module = $request->getModuleName(); $resource = $action; //$controller; //-- Si la ressource existe --// if (!$this->_acl->has($resource)) { $resource = null; } //-- Si l'accès à la ressource est autorisé --// if (!$this->_acl->isAllowed($role, $resource, $action)) { //-- Accès aux pages : pas d'identité if (!$this->_auth->hasIdentity()) { $module = $this->_noauth['module']; $controller = $this->_noauth['controller']; $action = $this->_noauth['action']; } else { $module = $this->_noacl['module']; $controller = $this->_noacl['controller']; $action = $this->_noacl['action']; } }
Ce code est bien sûr un copié collé adapté des exemples trouvés. Mais je ne comprends vraiment pas à quoi sert ces lignes
//-- Accès aux pages : pas d'identité if (!$this->_auth->hasIdentity()) { $module = $this->_noauth['module']; $controller = $this->_noauth['controller']; $action = $this->_noauth['action']; } else { $module = $this->_noacl['module']; $controller = $this->_noacl['controller']; $action = $this->_noacl['action']; }
Le IF est exécuté si la personne n'est pas identifié. Dans ce cas je le retourne vers un controlleur d'un module associé à une action par défaut. Mais dans l'autre cas, c'est à dire dans le ELSE, les ACL ne sont pas accepté et je vais vers la page No_ACL
Le pb est que je dois tester si l'utilisateur est authentifié (ça c'est bon), si l'utilisateur à le droit d'acceder à une action d'un module. Le pb est que je dois passer et le module et l'action pour effectuer mon test.
Je m'explique je définis dans l'acl que seul l'admin puisse acceder au module client et à l'action supprimer de la manière suivante : $this->allow('admin', 'client', 'ajouter'); mon if (!$this->_acl->isAllowed($role, $resource, $action)) me retourne toujours faux.
Comment faire pour faire un test sur : le Role, la Ressource et l'Attribut (ajouter, supprimer, etc) ?
merci
Dernière modification par whitespirit (11-03-2008 09:29:17)
Hors ligne
J'ai trouvé. En fait dans allow() on peut lui donner les paramètres ROLE, RESSOURCE, PRIVILEGE. Mais il me fallait identifier ou se trouvait ces informations
$resource = $module; //$controller; $privilege = $action;
Et non l'$action ou le $controlleur.
Ceci dit je ne sais toujours pas à quoi sert cette ligne
$role = $this->_auth->getIdentity()->getUser()->role;
Dernière modification par whitespirit (11-03-2008 07:43:53)
Hors ligne
Ben j'ai trouvé d'ou sortait cette ligne. En fait dans l'exemple que j'ai suivi, la méthode :
public function getUser() { if($this->hasIdentity()) { $user = $this->auth->getIdentity(); return $user; } }
était implémenté. N'ayant pas réussi à utiliser le tuto tel quel, je n'ai pas utilisé l'héritage pour ma classe LoginAuth. Ceci dit, mon code fonctionne même s'il n'est pas optimal.
Hors ligne
En fait, ca depends ce que tu as enregistré comme 'Identity' dans l'identification.
Moi, comme j'utilise Doctrine pour gérer ma base de donnée, et que mes role s'apelles des groupes, dans mon code, ca donne ca :
$role = $this->_auth->getIdentity()->UserGroup->name;
GetIdentity() me renvoit mon object 'Record', UserGroup est la jointure vers la table des groupes, et name me renvoi le nom du group.
Hors ligne
Oui, ça doit être ça. Mais ça veut dire qu'il faut dériver de la classe Zend_Auth j'imagine. Chose que je n'ai pas faite, du coup, ma fonction getIdentity n'est pas appelé. Merci
Hors ligne
nORKy a écrit:
En fait, ca depends ce que tu as enregistré comme 'Identity' dans l'identification.
Moi, comme j'utilise Doctrine pour gérer ma base de donnée, et que mes role s'apelles des groupes, dans mon code, ca donne ca :
$role = $this->_auth->getIdentity()->UserGroup->name;
GetIdentity() me renvoit mon object 'Record', UserGroup est la jointure vers la table des groupes, et name me renvoi le nom du group.
Peux-tu montrer un exemple de ton code ???
Je serai vraiment très intéressé de voir se que cela donne.
Hors ligne
Mon code ? C'est celui de Doctrine
le getIdentity() de Zend renvoi juste ce que tu lui as demandé d'enregistré.
Dans mon cas, j'enregistre un Object User (qui étends Doctrine_Record)
Tout est géré par doctrine, je n'ai rien à faire
Dans Doctrine, tu as au moins 1 type d'objet à définir.
Cet objet représent un enregistrement de d'une table.
Par exemple, j'ai un objet User (qui représente un utilisateur) et UserGroup (qui représente un groupe)
On peut aussi définir un objet représentant une table mais ce n'est pas obligatoire
Sans rentré dans les détails, j'ai écris des relations entre ces objets et Doctrine sait comment obtenir les infos
d'un groupe en passant par un utilisateur.
Ademettons, je connais l'id d'un utilisateur, et que je veux le nom du groupe de l'utilisateur
$user = Doctrine::getTable('User')->findById($id); // $user est un object de type User // // on veut afficher le nom de son groupe : echo $user->UserGroup->name;
Doctrine se charge de faire le requète nécessaire à l'obtention de l'objet userGroup, une fois qu'il a l'objet, il en tire le nom du groupe.
La machine de doctrine est complexe, car dans mon cas, j'ai une table intermédiaire qui fait la relation entre les users et les groupes. Mais, Doctrine gère tout.
Pour plus d'infos sur doctrine :http://www.doctrine-project.org/
L'énumartion des fonctions de doctrine sont trop longue..
Dernière modification par nORKy (18-09-2008 10:24:22)
Hors ligne
Pages: 1