Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 11-03-2008 06:19:45

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

[résolu] Zend_Acl et Auth : Comprendre un code qui fonctionne

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.

Code:

//$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 :

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

Code:

            //-- 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

 

#2 11-03-2008 07:43:27

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [résolu] Zend_Acl et Auth : Comprendre un code qui fonctionne

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

Code:

        $resource         = $module;    //$controller;
        $privilege        = $action;

Et non l'$action ou le $controlleur.

Ceci dit je ne sais toujours pas à quoi sert cette ligne

Code:

$role = $this->_auth->getIdentity()->getUser()->role;

Dernière modification par whitespirit (11-03-2008 07:43:53)

Hors ligne

 

#3 11-03-2008 09:28:58

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [résolu] Zend_Acl et Auth : Comprendre un code qui fonctionne

Ben j'ai trouvé d'ou sortait cette ligne. En fait dans l'exemple que j'ai suivi, la méthode :

Code:

    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

 

#4 12-03-2008 15:04:08

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [résolu] Zend_Acl et Auth : Comprendre un code qui fonctionne

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.


----
Gruiiik !

Hors ligne

 

#5 13-03-2008 05:31:32

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [résolu] Zend_Acl et Auth : Comprendre un code qui fonctionne

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

 

#6 17-09-2008 15:53:58

Julien Breux
Nouveau membre
Date d'inscription: 17-09-2008
Messages: 8

Re: [résolu] Zend_Acl et Auth : Comprendre un code qui fonctionne

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

 

#7 18-09-2008 10:23:11

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [résolu] Zend_Acl et Auth : Comprendre un code qui fonctionne

Mon code ? C'est celui de Doctrine smile

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

Code:

$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)


----
Gruiiik !

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages