Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-02-2008 10:10:00

bertra
Membre
Date d'inscription: 06-02-2008
Messages: 130

[Zend_Acl][1.5]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/tutor … 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... smile
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:

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

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:

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

Hors ligne

 

#2 29-02-2008 19:35:04

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

Perso je me suis inspiré de la méthode que propose julien: http://julien-pauli.developpez.com/tuto … auth-http/
Dans mon cas, ça correspondait exactement à ce que je cherchais mais je vois que pour toi c'est un peu différent.

Hors ligne

 

#3 02-03-2008 12:35:01

bertra
Membre
Date d'inscription: 06-02-2008
Messages: 130

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

Oui , j'avais egalement jeté un coup d'oeil sur ce tuto, mais cette phrase :

Julien a écrit:

Il faut ensuite comparer ces données avec une source, ca sera le rôle d'un objet Zend_Auth_Adapter_Http_Resolver_File, les identifiants seront donc stockés dans un fichier. C'est pour HTTP actuellement le seul 'conteneur'.

me fait penser que dans tous les cas cette methode n'est pas adaptée à mon cas puisqu'elle semble réservée à un sockage des login/password dans un fichier alors que moi j'ai besoin vu le nombre d 'utilisateur et la volontée des gérer les droits par utilisateur de les stocker dans un base de donnée.
J'ai raison ou bien ?

Dernière modification par bertra (02-03-2008 12:36:49)

Hors ligne

 

#4 02-03-2008 15:57:37

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

Bah moi j'ai mes users en base sur 3 projets smile et j'ai pas de fichiers!
J'avais même pas lu ce passage (ou j'men rapelle pas)

Hors ligne

 

#5 02-03-2008 19:11:27

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

mon modèle est un peut plus complexe.
j'ai des utilisateurs des rôles et des groupes de travail

un utilisateur reposent un personne ayant accès à l'application.
un rôle représente un ensemble de droits fonctionnels (admin, comptable, vendeur éditeur, modérateur etc.)
un workgroup est un espace sur le quel on peut exercer son droit "admin du forum machin " "admin de l'application" "modérateur du forum machin" etc.

et enfin dans tout ça j'ai un liaisons entre ces trois partie appelé profil.

sekaijin a pour profil administrateur général
MoOX a pour profil éditeur rubrique ZF
etc.

les ACL servent à décrire la liste des droits fonctionnels d'un rôle.
les actions limitent la couverture de ses droits à l'espace de l'utilisateur.

tous les rôles n'étant pas possible dans tous les groupes j'ai une typologie de groupe qui est en relation avec les rôle autorisé pour ce type.

j'ai fait un module générique pour gérer cela et je le réutilise d'appli en appli. il suffit de le paramètrer
entrer la liste des rôles et des type groupe
définir les ACL pour chaque rôle

pour le reste c'est pris en charge par mon module.

Hors ligne

 

#6 02-03-2008 19:48:30

bertra
Membre
Date d'inscription: 06-02-2008
Messages: 130

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

Ok merci pour la réponse, pour reprendre ma question du début, tu stockes un code dans la table des utilisateurs, recupèré en même temps que l'authentification et ensuite tu géres dans le predispatch un accés ou non à une ressource ? J'aimerais savoir comment acl s'insere dans le mvc.

Dernière modification par bertra (02-03-2008 19:50:30)

Hors ligne

 

#7 02-03-2008 20:12:57

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

Perso je fais ça simplement avec un plugin (remplit de définitions des acl dans la méthode init()) fourni au front controller dans le bootstrap (cf. tutorial) . Voilà tout smile

Hors ligne

 

#8 02-03-2008 21:17:11

bertra
Membre
Date d'inscription: 06-02-2008
Messages: 130

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

oui oui, apres avoir lu :
http://www.kitpages.fr/zf_helper_plugin.php
j'ai maintenant bien conscience de l'utilité des plugins et du fait que ce soit ca qu'il faut utiliser pour gérer les accés.

Hors ligne

 

#9 04-03-2008 18:22:14

bertra
Membre
Date d'inscription: 06-02-2008
Messages: 130

Re: [Zend_Acl][1.5]Acl Auth fonctionnement général

sekaijin a écrit:

mon modèle est un peut plus complexe.
j'ai des utilisateurs des rôles et des groupes de travail

un utilisateur reposent un personne ayant accès à l'application.
un rôle représente un ensemble de droits fonctionnels (admin, comptable, vendeur éditeur, modérateur etc.)
un workgroup est un espace sur le quel on peut exercer son droit "admin du forum machin " "admin de l'application" "modérateur du forum machin" etc.

et enfin dans tout ça j'ai un liaisons entre ces trois partie appelé profil.

sekaijin a pour profil administrateur général
MoOX a pour profil éditeur rubrique ZF
etc.

les ACL servent à décrire la liste des droits fonctionnels d'un rôle.
les actions limitent la couverture de ses droits à l'espace de l'utilisateur.

tous les rôles n'étant pas possible dans tous les groupes j'ai une typologie de groupe qui est en relation avec les rôle autorisé pour ce type.

j'ai fait un module générique pour gérer cela et je le réutilise d'appli en appli. il suffit de le paramètrer
entrer la liste des rôles et des type groupe
définir les ACL pour chaque rôle

pour le reste c'est pris en charge par mon module.

Sous quelle licence est ton module ?
J'ai besoin d'exemples smile

Dernière modification par bertra (04-03-2008 18:22:36)

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