Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-06-2009 11:33:38

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

[1.8] Ma gestion authentification/autorisation

Bonjour à tous,

J'ai pour le moment une authentification qui marche à peu près bien. J'aimerai pouvoir gérer l'autorisation avec des ACLs, mais avec un truc simple. J'imagine par exemple un utilisateur stocké en base avec les champs "id, nom, prenom, login, password, role, etc."

Voici mon LoginController.php

public function loginAction()
    {
           
        if($this->getRequest()->isPost())
        {      
             
              
            $filtre_champ = new Zend_Filter();
            $filtre_champ->addFilter(new Zend_Filter_StripTags())
                         ->addFilter(new Zend_Filter_Alnum())
                         ->addFilter(new Zend_Filter_StringToLower())
                         ->addFilter(new Zend_Filter_StringTrim());

                    $username = $filtre_champ->filter($this->_request->getPost('username'));
                $password = $filtre_champ->filter($this->_request->getPost('password'));
           
            if (empty($username) || empty($password))
            {
                $this->view->message = "Vous devez fournir un login et un mot de passe";
            }else
                   {
               
                $dbAdapter = Zend_Db_Table::getDefaultAdapter();
                $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
                               

            $authAdapter->setTableName('users')
                            ->setIdentityColumn('users_login')
                            ->setCredentialColumn('users_password');
                           
       
            $authAdapter->setIdentity($username)
                           ->setCredential($password);
                           
           
                $result = $this->_auth->authenticate($authAdapter);
                if($result->isValid())
                {
                       // success
                   
                   
                    // On récupère l'utilisateur
                      $users = new Model_DbTable_Users();
                    $users = $users->getUsersByLogin($username);
           
                    // On enregistre ses informations en session
                     $userNamespace = new Zend_Session_Namespace('user');
                    $userNamespace->array = array(
                        'login'     => $users['users_login'],
                        'password'    => $users['users_password'],
                        'nom'        => $users['users_nom'],
                        'prenom'    => $users['users_prenom'],
                           'role'    => $users['users_role']
                    );
                   

                    $this->_redirect('/');
                   
                }
                else
                {
                    $this->view->message         = "Vous devez fournir des identifiants valides";
                ...

- Vous remarquerez qu'aujourd'hui je stocke tous attributs de l'utilisateur en session, je ne sais pas si c'est recommandé !?

- Quel avantage à utiliser ce fragement code plutôt que Zend_Session :

$data = $authAdapter->getResultRowObject(null, 'password');
$auth->getStorage()->write($data);

En ce qui concerne les ACLs, j'ai réalisé un premier script, qui ajoute mes rôles, mes ressources et mes permissions de bases :

My_Acl.php

class My_Acl extends Zend_Acl
{
    public function __construct()
    {
        // Ajout du rôle guest
        $this->addRole(new Zend_Acl_Role('guest'));
       
        // Ajout du rôle admin qui hérite du rôle guest
        $this->addRole(new Zend_Acl_Role('admin'), 'guest');
       
        // Ajout d'une ressource test
        $this->add(new Zend_Acl_Resource('test1'));
        $this->add(new Zend_Acl_Resource('test2'));
       
        // Ajout de permissions
        $this->allow('guest', 'test1', 'lire');
        $this->allow('admin', 'test1', 'administrer');
    }
}

- Que reste-il à faire pour implémenter mes ACLs dans mon contrôleur d'authentification ?

J'avoue être un peu paumé. La plupart des exemples sur le net propose de faire une autorisation en fonction du contrôleur et de l'action. Je ne sais pas si j'ai vraiment besoin de ça personnellement.


aka miboo

Hors ligne

 

#2 18-06-2009 13:15:58

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [1.8] Ma gestion authentification/autorisation

Salut miboo,

Pour ma part, j'ai créer une  classe  modele userRole :

Code:

public function __construct()
    {
        $this->ajouterRoles();
    }
    
    public function ajouterRoles()
    {
        
        $listeRole = array('user', 'visiteur', 'cadre non encadrant', 'responsable section gestion',
                            'responsable direction', 'responsable departement', 'correspondant direction', 
                            'controleur gestion', 'administrateur', 'superviseur');
$listeResource = array('Auth', 'index', 'saisies')
//création des rôles
        for($i = 0; $i < count($listeRole); $i++)
            $this->addRole(new Zend_Acl_Role($listeRole[$i]));
        
        
        //création des ressources
        for($i = 0; $i < count($listeResource); $i++)
            $this->add(new Zend_Acl_Resource($listeResource[$i]));
//établissement des règles de droit d'accès
        //pour les personnes non authentifiées
        $this->allow('visiteur', 'Auth');
        
        //pour les employés
        $this->allow('user', 'Auth');
        $this->allow('user', 'saisies'); } }

Et, dans un dossier application/bean j'ai créer une classe userAcl

Code:

class UserAcl
{
    private $user; //User
    private $roles; //Zend_Acl_Role

    /**
     * $nom String
     * $prenom String
     * $email String
     * $roles String Zend_Acl_Role
     */
    public function __construct($nom, $prenom, $email, $role)
    {
        $this->user = new Utilisateur($nom,$prenom,$email);
        $this->role = $this->extractRole($role);
    }

    /*private function extractRoles($roles){
        $result = array();
        foreach ($roles as $role) {
            $result = $this->extractRole($role);
        }
        return $result;
    }*/

    private function extractRole($role){

        if ($role instanceof Zend_Acl_Role ){
            return $role;
        }
        return new Zend_Acl_Role($role);
    }

    public function getRole(){
        return $this->role;
    }

    /**
     * Retourne le nom du rôle de l'utilisateur sous forme de string
     * @return string $name
     */
    public function getRoleByName(){
        return $this->role->getRoleId();
    }
    
    /**
     * Vérifie si le string passé en paramètre correspond au rôle de l'utilisateur
     * @param string $aRole
     * @return boolean
     */
    public function containsRole($aRole){
        $roleExtracted = $this->extractRole($aRole);
        return $roleExtracted == $this->role;    
    }
    
    public function getUser(){
        return $this->user;
    }
    /*
     * $role String Zend_Acl_Role
     */
    public function addRole($role)
    {
        $this->role = $this->extractRole($role);
    }

    /**
     * Vérifie si l'utilisateur est autorisé à accéder à une ressource
     * @param Zend_Acl $acls
     * @param Zend_Acl_Ressource $ressource
     * @param Zend_Acl_Ressource $privilege
     * @return boolean
     */
    public function isAllowed(Zend_Acl $acls, $ressource, $privilege = null){
        
            return $acls->isAllowed($this->role, $ressource,$privilege);
    }
    
    /**
     * Teste l'existence d'un droit parmi les droits attribuables
     * @param $role String
     * @return $role String
     */
    public function exist($role)
    {
        $acl = $_SESSION['acls'];
        if(array_key_exists($role, $acl->getAlias()))
        {
            $role = $acl->alias[$role];
        }
        return $role;
    }
    
    /**
    * Possède tous les droits ? Pour les tests sur les droits il vaut mieux 
    * utiliser les tests classiques qui retournent toujours vrai dans le cas 
    * du superutilisateur.
    * @return boolean
    */
    function hasAllRights()
    {
        $acl = $_SESSION['acls'];
        return $acl->getGrantAll();
    }
    
    /**
    * @return boolean
    */
    public function has($role)
    {
        return $this->role->getRoleId() == $role;
    }
    
    /**
     * @param string[] $roles
     * @return boolean
     */
    public function hasOneOf($roles)
    {
        if(!is_array($roles)){
            $tabRoles = array($roles);
        } else {
            $tabRoles = $roles;
        }
        
        foreach ($tabRoles as $role)
        {
            if ($this->has($role)){
                return true;
            }
        }
        return false;
    }
}
?>

Ensuite, dans une autre classe modèle AuthAdapter qui surcharge la méthode authenticate() du framework, je récupère les droits en base et je les attributs à une instance de ma classe userAcl

Code:

dans la fonction surchargée authenticate () :
$_SESSION['acls'] = $acls;
                
                $userAcl = $_SESSION['userAcl'];
                if($user->PER_DROITS == 405)
                {
                    $userAcl->addRole('administrateur');
                }

J'espère que ça pourra t'aider.

Cordialement,


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#3 19-06-2009 11:13:35

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: [1.8] Ma gestion authentification/autorisation

Merci pour ton aide.

Mais dans mon cas précis je n'arrive pas à faire le lien entre

AuthController

'role'    => $users['users_role']

et ma classe MyAcl.

Autrement dit je ne vois pas comment joindre mon attribut rôle de ma table utilisateur à ma classe Acl.


Quelqu'un peut m'éclaircir ?


aka miboo

Hors ligne

 

#4 24-06-2009 10:27:24

Vincent
Administrateur
Date d'inscription: 19-09-2008
Messages: 510

Re: [1.8] Ma gestion authentification/autorisation

Personne?


aka miboo

Hors ligne

 

#5 24-06-2009 11:04:47

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

Re: [1.8] Ma gestion authentification/autorisation

Beh.. personnellement, je ne comprends pas ta question smile


----
Gruiiik !

Hors ligne

 

#6 24-06-2009 13:33:18

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [1.8] Ma gestion authentification/autorisation

Salut, et désolé d'avoir mis du temps à te fournir une autre réponse.

Je suis passé par une classe bean userAcl (je t'ai donné le code plus haut).


La réponse que tu cherches est dans le dernier morceau de code que je t'ai fourni. Tu effectues une requête qui récupère le droit de l'utilisateur stocké en base et tu le rajoutes à la classe userAcl par le biais de la méthode addRole()


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#7 24-06-2009 14:10:17

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

Re: [1.8] Ma gestion authentification/autorisation

Moi, j'ai implémenté Zend_Acl_Role_Interface dans ma classe User.


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