Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-03-2008 15:51:38

salma
Membre
Lieu: Tunis
Date d'inscription: 29-02-2008
Messages: 20

comment utiliser Zend_Acl ?

Bonjour,
j'ai utilisé Zend_auth pour ouvrir des sessions aux différents utilisateurs de l'application. Mais, j'ai des pages comme supprimer.phtml et modifier.phtml qui ne doit être accèdées que par l'administrateur.
J'ai créé une table user pour la gestion des utilisateur. Mais j'ai pas compris comment utilisé Zend_acl dans ce cas. Car j'ai vu un tutoriel qui permet d'afficher si tel utilisateur a le droit d'accèder à une page ou non juste en affichant un message.
voici le lien:
http://www.kitpages.fr/zf_zendAcl.php

1) Comment le programme sait que c'est bien l'administrateur qui est connecté?
2) Comment peut-il interdire à un autre utilisateur d'accéder à la page "supprimer"?
Merci d'avance.


“Un sourire coute moins cher que l'électricité, mais il donne autant de lumière.” big_smile

Hors ligne

 

#2 11-03-2008 06:33:23

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

Re: comment utiliser Zend_Acl ?

Je suis en train d'écrire ce genre de code, mais pour l'instant je n'ai pas encore trouvé la solution stable. Commence par lire ce tuto un peu bourrin pour commencer mais en gros c'est comme ça qu'on doit faire (je crois) : http://alain-sahli.developpez.com/tutor … work/acl/. L'exemple n'est pas complet. Si t'es vraiment débutant, comprends déjà à quoi sert les plugins, c'est à dire lis cet article http://www.kitpages.fr/zf_helper_plugin.php.

Enfin, si tu ne le sais pas encore la fonction preDispatch est appelé avant l'appels aux actions (grossomodo). C'est à ce niveau qu'il faut tester tes acls/authentification dans le plugin que tu dois écrire.

Dernière modification par whitespirit (12-03-2008 06:06:34)

Hors ligne

 

#3 11-03-2008 11:16:19

salma
Membre
Lieu: Tunis
Date d'inscription: 29-02-2008
Messages: 20

Re: comment utiliser Zend_Acl ?

Merci beaucoup whitespirit,
Je vais lire ces tutos. Et si tu arrive à trouver une solution à ce code dis moi SVP.
Merci wink


“Un sourire coute moins cher que l'électricité, mais il donne autant de lumière.” big_smile

Hors ligne

 

#4 11-03-2008 11:23:57

salma
Membre
Lieu: Tunis
Date d'inscription: 29-02-2008
Messages: 20

Re: comment utiliser Zend_Acl ?

Mais excuse moi un peu,
ce tutoriel de developpez: http://alain-sahli.developpez.com/tutor … ework/acl/
est comme du chinois pour moi, ce n'est pas clair du tout. J'ai voulu essayer d'implémenter son exemple d'application mais je n'arrive pas à le faire.


“Un sourire coute moins cher que l'électricité, mais il donne autant de lumière.” big_smile

Hors ligne

 

#5 11-03-2008 11:54:58

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

Re: comment utiliser Zend_Acl ?

Figure toi que j'ai réussi à implémenter l'authentification & les acls de manière très statique et qui fonctionne, mais ça reste assez complexe pour comprendre. Dans un premier temps, je n'ai pas gérer les Acl via une bd mais à terme c'est prévu : j'aurai une table User, une table Role, une table Ressource et une table Privilège.

Je vais te faire un résumer de ce que j'ai fais :

J'ai une classe MyAcl :

Code:

/**
 * Gestion des ACL personnalisés.
 * Les rôles, ressources et privilèges sont définis manuellement mais à terme ils doivent être inscrit dans une bd et
 * générer automatiquement.
 * 
 * Dans mon application : 
 *             - un Role         = un type d'utilisateur : guest, member, publisher, admin, super admin
 *             - une ressource = un module (structure, appart, etc.)
 *             - un Privilège     = une action (ajouter, modifier, supprimer, détail, rechercher)
 * @author Yvan
 */
class MyAcl extends Zend_Acl
{
    /**
     * Constructeur : je défini en bourrin mes acls ici
     *
     * @param Zend_Auth $auth
     */
    public function __construct(Zend_Auth $auth)
    {
        //parent::__construct();
        
        $roleGuest = new Zend_Acl_Role('guest');
        
        //==============================================================================//
        //                        DEFINITION DES RESSOURCES                                //
        //==============================================================================//
        $this->add(new Zend_Acl_Resource('default'));
        $this->add(new Zend_Acl_Resource('structure'));
        $this->add(new Zend_Acl_Resource('appart'));
        $this->add(new Zend_Acl_Resource('pretendant'));
        $this->add(new Zend_Acl_Resource('locataire'));
        $this->add(new Zend_Acl_Resource('location'));
        $this->add(new Zend_Acl_Resource('facture'));
        $this->add(new Zend_Acl_Resource('plainte'));
        $this->add(new Zend_Acl_Resource('dette'));            //-- zone ou le client pourra avoir un suivi de ses commandes
        $this->add(new Zend_Acl_Resource('reclamation'));                    
        $this->add(new Zend_Acl_Resource('collaborateur'));                    //-- bon de livraison, bon de commande        
        $this->add(new Zend_Acl_Resource('quitance'));
        $this->add(new Zend_Acl_Resource('configuration'));
        $this->add(new Zend_Acl_Resource('user'));
        $this->add(new Zend_Acl_Resource('portal_user'));
        
        
        //==============================================================================//
        //                        CREATION DES ROLES                                        //
        //==============================================================================//
        $this->addRole(new Zend_Acl_Role('guest'));                //-- rôle "invité"
        $this->addRole(new Zend_Acl_Role('member'));            //-- rôle "membre"
        $this->addRole(new Zend_Acl_Role('publisher'));            //-- rôle "publisher"
        $this->addRole(new Zend_Acl_Role('admin'));                //-- rôle "administrateur"
        $this->addRole(new Zend_Acl_Role('super_admin'));        //-- rôle "super administrateur"
        
        
        //-- Affectation des rôles 
        $this->allow('guest', 'default');        // Les invités peuvent uniquement voir la home

        //==============================================================================//
        //                        GESTION DES MEMBRES                                        //
        //==============================================================================//
        //-- Autorisation --//
        $tabMembreAllow = array('index', 'detail', 'rechercher');
        
        $this->allow('member', 'default');    
        $this->allow('member', 'structure',     $tabMembreAllow);    
        $this->allow('member', 'appart',         $tabMembreAllow);
        $this->allow('member', 'pretendant',    $tabMembreAllow);
        $this->allow('member', 'locataire',     $tabMembreAllow);
        $this->allow('member', 'location',        $tabMembreAllow);
        $this->allow('member', 'facture',         $tabMembreAllow);
        $this->allow('member', 'plainte',        $tabMembreAllow);
        $this->allow('member', 'reclamation',     $tabMembreAllow);
        $this->allow('member', 'quitance',        $tabMembreAllow);
        //$this->allow('member', 'configuration',    $tabMembreAllow);    //-- Seul l'admin gère les utilisateurs
        //$this->allow('member', 'user',            $tabMembreAllow);    //-- seul l'admin gère les utilisateurs
        $this->allow('member', 'portal_user',    $tabMembreAllow);

        //-- Refuser --//
        $tabMembreDeny = array('supprimer', 'modifier','ajouter');
        
        $this->deny('member', 'structure',         $tabMembreDeny);    
        $this->deny('member', 'appart',         $tabMembreDeny);
        $this->deny('member', 'pretendant',     $tabMembreDeny);
        $this->deny('member', 'locataire',         $tabMembreDeny);
        $this->deny('member', 'location',         $tabMembreDeny);
        $this->deny('member', 'facture',         $tabMembreDeny);
        $this->deny('member', 'plainte',         $tabMembreDeny);
        $this->deny('member', 'reclamation',     $tabMembreDeny);
        $this->deny('member', 'quitance',         $tabMembreDeny);
        $this->deny('member', 'configuration');                            //-- Seul l'admin gère les utilisateurs
        $this->deny('member', 'user');                                    //-- seul l'admin gère les utilisateurs
        $this->deny('member', 'portal_user',     $tabMembreDeny);

              //-- IDEM POUR LES AUTRES ROLES

    }
}

Cette classe indique les Acl à respecter, qui à droit à quoi.
J'ai un plugin qui pour chaque page va tester si l'utilisateur à le droit d'accéder à la page. ce plugin est enregistré dans le bootstrap (index.php)

Code:

 //extrait de mon bootstrap
//============================================================================================================
//                         Gestion des rôles avec Acl et Auth
//============================================================================================================
$auth             = Zend_Auth::getInstance();
$authAdapter     = new Zend_Auth_Adapter_DbTable($db);
$loginAuth         = new LoginAuth($db,$authAdapter,$auth);        //-- LoginAuth est une classe perso qui va gérer l'interface utilisateur
$registry->set('loginAuth', $loginAuth);                        //-- Instance LoginAuth qui sera utilisé dans le Controlleur AuthController

Zend_Loader::loadClass('MyAcl');                        //-- Charge les ACL
$acl = new MyAcl($auth); 
Zend_Registry::set('acl', $acl);

Zend_Loader::loadClass('MyPluginAuth');                                //-- Plugin  Gestion des acl et authentification
$frontController->registerPlugin(new MyPluginAuth($auth, $acl));    //-- Enregistrement du plugin
//==========================================
<?php 
/**
 * Type : Plugin
 * 
 * Ce plugin gère l'Authentification et les ACL. Il est appelé par la méthode preDispatch() à chaque visite d'une page.
 * Suivant le controlleur, le module et l'action visité par l'utilisateur, on détermine s'il est authentifié et s'il respecte
 * les Acl mis en place.
 * 
 * L'authentification propre est géré via la classe : LoginAuth.php
 * Les Acls sont gérés via la classe : MyAcl.php
 *
 * @author Yvan
 */
class MyPluginAuth extends Zend_Controller_Plugin_Abstract
{
    /**
     * Instance d'authentification 
     *
     * @var Zend_Auth::getInstance 
     */
    private $_auth;
    
    /**
     * ACL en cours : Définis dans la classe MyACL
     *
     * @var Zend::Acl
     */
    private $_acl;

    /**
     * Utilisateur non authentifié : redirection vers la page de login
     *
     * @var array
     */
    private $_noauth = array('module' =>'default',
                            'controller' => 'auth',
                            'action' => 'login');

    /**
     * Utilisateur ne respectant pas les ACL : redirection vers la page par défaut
     *
     * @var array
     */
    private $_noacl = array('module' => 'default',
                            'controller' => 'index',
                            'action' => 'index');

    /**
     * Constructeur : Initialise les variables privés d'Authentification et de gestion des ACL
     *
     * @param Zend_Auth::getInstance() $auth récupéré grâce à la méthode getInstance() de ZF
     * @param Zend::Acl $acl
     */
    public function __construct($auth, $acl)
    {
        $this->_auth = $auth;
        $this->_acl = $acl;
    }

    /**
     * Est appelé en PreDispatch et décide pour chaque page visité si l'utilsiateur est identifié et respecte les ACL
     *
     * @param Zend_Controller_Request_Abstract $request
     */
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        //-- Utilisateur Est identifié ? Par défaut c'est un invité
        if ($this->_auth->hasIdentity()) 
        {
            $identity = $this->_auth->getIdentity();            
            $role = $identity->ROLE;
        } else {
            $role = 'guest';
        }
        
        //-- Récupère le Controlleur + l'Action + le Module visité par l'utilisateur en cours
        $controller     = $request->getControllerName();
        $action         = $request->getActionName();
        $module         = $request->getModuleName();
        
        //-- Détermine qu'est ce que la RESSOURCE et le PRIVILEGE dans notre cas --//
        $resource         = $module;    //-- ressource
        $privilege        = $action;    //-- Privilège
                
        //-- Si la ressource existe --//
        if (!$this->_acl->has($resource)) 
        {
            $resource = null;
        }

        //-- Si l'accès à la ressource + priviliège est autorisé  est autorisé --//
        if (!$this->_acl->isAllowed($role, $resource, $privilege)) 
        {
            //-- Si l'utilisateur n'est pas identifié, on le redirige vers la page de connexion
            if (!$this->_auth->hasIdentity()) {
                $module     = $this->_noauth['module'];
                $controller = $this->_noauth['controller'];
                $action     = $this->_noauth['action'];
            }
            else //-- Sinon l'utilisateur est enregistré mais n'a pas les droits ACL, on redirige vers la page par défaut
            {                
                $module     = $this->_noacl['module'];
                $controller = $this->_noacl['controller'];
                $action     = $this->_noacl['action'];
            }
        }

        //-- redirection vers le module + controlleur + action en sortant du plugin --//
        $request->setModuleName($module);
        $request->setControllerName($controller);
        $request->setActionName($action);
    }
}

Et j'ai une classe gérant l'authentification. Là je ne l'ai pas fait dans les règles de l'art car cette classe n'hérite pas de Auth.

Code:

<?php
/**
 *  Classe de gestion de l'authentification selon ZF
 * L'authentification utilise un objet de type Zend::Auth. Cet objet se connectera à la table USERS et récupère le champs ROLE qui 
 * contient le rôle utilisé par l'ACL.
 * 
 * @author Yvan 
 */
class LoginAuth 
{
    /**
     * Adaptateur contenant la connexion à la bd
     *
     * @var Zend_Db
     */
    protected $dbAdapter;
    
    /**
     * Connexion d'auhtentification 
     *
     * @var Zend_Auth_Adapter_DbTable
     */
    protected $authAdapter;
    
    /**
     * Objet ZF d'authentification
     *
     * @var Zend::Auth
     */
    protected $auth;

    /**
     * Constructeur
     *
     * @param Zend_Db $dbAdaptateur
     * @param Zend_Auth_Adapter_DbTable $authAdaptater
     * @param Zend::Auth $auth
     */
    public function __construct($dbAdaptateur, $authAdaptater, $auth)
    {
        $this->dbAdapter     = $dbAdaptateur;
        $this->authAdapter     = $authAdaptater;
        $this->auth            = $auth;
    }
    
    
    /**
     * Authentification d'un utilisateur en utilisant l'objet Zend::Auth
     *
     * @param string $username nom d'utilisateur
     * @param string $password mot de passe
     * @return Zend::Zend_Auth_Result
     */
    public function authenticate($username, $password)
    {                                        
        //-- Défini la table User et indique les nom Username et Password que l'on vient de récupérer
        $this->authAdapter->setTableName('users');
        $this->authAdapter->setIdentityColumn('username');
        $this->authAdapter->setCredentialColumn('password');
                
        // Set the input credential values to authenticate against
        $this->authAdapter->setIdentity($username);
        $this->authAdapter->setCredential($password);
                
                
        //-- Test si l'authentification est ok, et sauvegarde automatiquement dans la session
        $result = $this->auth->authenticate($this->authAdapter);
        
        return $result;
    }
    
    /**
     * Retourne VRAI si l'utilisateur est identifié
     *
     * @return booléen : true, utilisateur identifié, false sinon
     */
    public function hasIdentity()
    {
        return ($this->auth && $this->auth->hasIdentity());
    }

    /**
     * Enregistre les informations de l'utilisateurs identifié dans l'objet Auth
     * Nous ne sauvegardons pas le mot de passe par sécurité
     */
    public function storeLoggedUser()
    {
        //$dbAdapter = Zend_Registry::get('dbAdapter');
        //$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);        
        
        if ($this->authAdapter) {
            $data = $this->authAdapter->getResultRowObject(null, 'PASSWORD');
            $this->auth->getStorage()->write($data);
        }
    }
    
    /**
     * Test si l'utilisateur/password existe dans la table User et l'authentifie dans Auth 
     *
     * @param $string $username nom d'utilisateur
     * @param $string $password mot de passe
     * @return booleen true si l'utilisateur existe
     */
    public function isUserExist($username, $password)
    {
         $result = $this->authenticate($username, $password);        
         return $result->isValid();
    }

    /**
     * Déconnexion de l'utilisateur
     */
    public function clearIdentity()
    {
        $this->auth->clearIdentity();
    }

    /**
     * Retourne l'identité d'un utilisateur authentifié
     *
     * @return mixed Zend_Auth_Result
     */
    public function getUser()
    {        
        if($this->hasIdentity()) 
        {
            $user = $this->auth->getIdentity();
            return $user;    
        }        
    }        
}
?>

Donc la dedans y'a plein de méthode et c'est ici qu'on gère l'authentification proprement dit, je ne m'interesse pas du tout au ACL là dedans.

Enfin tu as le controlleur qui gère la connexion (le login)

Code:

<?php
/**
 * Controlleur Index
 * Gère l'authentification sur le site    
 * @author Yvan 
 */
class AuthController extends Zend_Controller_Action
{
    protected $pathCtrl;
    protected $pathImg;

    /**
     * Classe LoginAuth assurant la gestion de l'authentification avec le composant Zend::Auth
     * Contiens les fonctions de connexions.
     *
     * @var Class LoginAuth 
     */
    protected $loginAuth;

    /**
     * Initialisation du controlleur
     */
    function init()
    {
        //========================================================================
        //    Processus d'identification LoginAuth
        //========================================================================
        Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
        $dbAdapter         = Zend_Registry::get('dbAdapter');
        $authAdapter     = new Zend_Auth_Adapter_DbTable($dbAdapter);
        $auth             = Zend_Auth::getInstance();
        
        $this->loginAuth = Zend_Registry::get('loginAuth');    
        
        //========================================================================
        //    Initialisation des paths de la page
        //========================================================================
        $pathCtrl = $this->_request->getBaseUrl();
        $this->initView();
        $this->view->baseUrl = $pathCtrl;
        $this->view->url_auth_login = $pathCtrl.'/auth/login';
        
        //-- path des images pour l'affichage .phtml
        $this->pathImg =  $this->_request->getBaseUrl().'/public/images/connexion/';
        $this->view->pathImg = $this->pathImg;
        
    }
    
       /**
     * Index : redirige vers le controller par défaut. Pas de gestion de Layout
     */
    function indexAction()
    {        
        $this->_helper->layout->disableLayout();        //-- Desactive le layout
        $this->_redirect('/');
    }

    /**
     * Login : traitement de l'utilisateur. L'utilisateur se connecte et envoie son nom d'utilsateur et mot de passe
     */
    function loginAction()
    {
        $this->_helper->layout->disableLayout();        //-- Desactive le Zend::Layout ()
        $this->view->message = '';
        
        //-- Si un post est envoyé
        if ($this->_request->isPost()) 
        {
            
            // collect the data from the user
            Zend_Loader::loadClass('Zend_Filter_StripTags');
            $f = new Zend_Filter_StripTags();
            
            //-- Récupère les infos par post
            $username = $f->filter($this->_request->getPost('username'));
            $password = $f->filter($this->_request->getPost('password'));
            
            //-- Si le nom est vide
            if (empty($username)) 
            {
                $this->view->message = TXT_INVALIDE_NAME;
            } 
            else 
            {                
                //-- Test si l'utilisateur existe -> lance le processus Authenticate()
                if ($this->loginAuth->isUserExist($username, $password)) 
                {
                    $this->loginAuth->storeLoggedUser();    //-- Enregistre l'utilisateur
                    $this->_redirect('/');        //-- redrection vers la page par défault
                } 
                else     //-- echec de l'authentification
                {
                    $this->view->message = TXT_ERROR_CONNEXION;
                }
            }
        }
        $this->view->title = TXT_TITRE_CONNEXION;
        $this->render();
    }
    
    /**
     * Déconnexion : Action Logout
     */
    function logoutAction()
    {
        $this->loginAuth->clearIdentity();
        $this->_redirect('/');
    }    
}

Bon comme tu vois, je suis un furieux des commentaires, et pour chaque ligne je lache un commentaire. La classe LoginAuth est utilisé que dans mon controlleur LoginController et ne gère que l'authentification. Les autres classes et plugin gère les acl et donc utilise l'objet Auth.

Il te manque juste mon code pour la création de la table User :

Code:

CREATE TABLE `users` (
  `ID` int(11) NOT NULL auto_increment,
  `USERNAME` varchar(128) default NULL,
  `PASSWORD` varchar(128) default NULL,
  `REAL_NAME` varchar(128) default NULL,
  `ROLE` varchar(255) default NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- 
-- Contenu de la table `users`
-- 

INSERT INTO `users` (`ID`, `USERNAME`, `PASSWORD`, `REAL_NAME`, `ROLE`) VALUES 
(1, 'admin', 'admin', 'admin', 'admin');

Ben voilà tu mon code complet de gestion des ACL et AUTH. Comme je l'ai dit au début, ce qui ne me plait pas du tout dans ce code est que les ACL sont gérer en statiques et si je veux ajouter un type d'utilisateur (role), privilège, etc, je dois le faire dans ce fichier php. Par la suite, je vais coder un petit module pour faire ça dynamiquement.

Dernière modification par whitespirit (11-03-2008 11:58:51)

Hors ligne

 

#6 20-03-2008 09:25:40

larenzu
Membre
Date d'inscription: 04-03-2008
Messages: 77

Re: comment utiliser Zend_Acl ?

Bonjour à tous .

Je réouvre ce topic parce que j'ai un petit dileme.

Dans ton predispatch tu verifies à chaque page les droits utilisateurs et l'authentification.
Comment pourrai t'on gerer ceci mais à pârtir d'un module et non du defaut.

Exemple : dans mon site j ai une partie admin (la seule ou l'utilisateur doit se connecter ) comment faire pour qu'il ne controle que cette partie la.

Ensuite doit t'on faire des requete du genre : select role from user where role like $acl_role  pour verifier tel ou tel utilisateur.

Doit t'on rentré les utilisateurs en dur dans le code des acl ( j ai 70 utilisateurs sad  )?


Merci beaucoup pour les précisions que vous m'apporterez mais c'est vrai que c'est pas trop clair la facon d'implémenter ces acl

Hors ligne

 

#7 20-03-2008 14:08:30

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

Re: comment utiliser Zend_Acl ?

Hello,

1. Dans ton cas, je n'aurai pas utilisé ce type de code. Si j'ai bien compris, t'as un site internet normal en front-end et une partie d'administration en back-end ? Si c'est le cas, c'est sûr que ça ne sert à rien de tous vérifier à chaque fois les pages. Dans mon cas, ce que je développe est plus dans l'esprit CRM, je n'ai pas de front-end. En fait, j'aurai peut-être simplement utilisé la méthode PreDispatch de ton controlleur gérant l'admin (ou de tes controlleurs, tel que Julien le fait dans son tuto sur developpez.com).

2. Actuellement, lorsque l'utilisateur se connecte et l'authentification est ok, je récupère son role, car il est dans la table user. Donc pas besoin de faire de Select, mais juste $user = auth->getIdentity et $user->ROLE

3. Maintenant j'ai codé le truc en dynamique, c'est à dire j'ai une table role, privilege, ressource et droit. Mais j'avoue que j'ai galéré. Actuellement, le truc qui me dérange, c'est que je n'ai pas réussi à  créer ma classe LoginAuth étendu de Zend_Auth.

Hors ligne

 

#8 20-03-2008 15:18:36

larenzu
Membre
Date d'inscription: 04-03-2008
Messages: 77

Re: comment utiliser Zend_Acl ?

a d'accord...

J'ai reflechis du coup ce matin et j'ai fait comme tu viens de me l'indiquer c'est à dire que j'ai crée un champs role dans ma table , et ensuite je fais un test dans mon controleur si la personne a les bons droits d'acces...

Je pense que ca suffira et je n'ai pas besoin d en ce cas d'utiliser les ACL qui me paraissent assez compliqués

Hors ligne

 

#9 21-03-2008 05:53:05

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

Re: comment utiliser Zend_Acl ?

Les acl sont vraiment utile si tu développe une système de gestion de droit complexe(et je t'assure, difficile à comprendre mais une fois compris, simple à mettre en oeuvre). En gros, tu créés des ressources, tu créés des rôles, tu attributs des privilèges à ces ressources et roles (ou retire). En plus tu peux faire de l'héritage de role. Serieux, c'est ultra puissant et qui dit puissant, dit simple à mettre en oeuvre. Après cette histoire de plugin dépend plus de ZF (les acl sont des elements que tu vas voir partout aujourd'hui, cms, réseau, windows server, etc). Après ZF fait tout ! Concrètement, dans ce cas, le plugin est juste un IF(cequetuveux) qui sera appelé avant chaque chargement de page !

Et si tu ne veux pas te prendre la tête, tu peux juste écrire

Code:

 $acl->isAllow("role","ressource")

et oublier les privilèges.

Hors ligne

 

#10 27-03-2008 12:04:55

zendframwork
Membre
Date d'inscription: 12-01-2008
Messages: 49

Re: comment utiliser Zend_Acl ?

salut whitespirit!
voila je galère encore et encore avec les acl.
j'ai vu les morceaux de codes  que tu as mis sur le forum et que tu as très bien commenté,malheureusement je rencontre encore des problème.j'aurai aimer voire ton code au complet pour le voire fonctionner.car je travail sur la même application que la tienne.
merci d'avance whitespirit.

Hors ligne

 

#11 28-03-2008 06:14:00

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

Re: comment utiliser Zend_Acl ?

En fait, tu as mon code complet smile Je n'ai rien de plus. Maintenant j'ai un peu automatisé tout ça, de façon à rendre le tout dynamique, mais le principe est exactement le même.

En soit, la manière dont j'ai réalisé mes acl ne sont pas plus compliqué que ça :
1. Configuration du bootstrap : qui ne fait pas grand chose, créer une instance de Auth, Acl et charge le plugin

2. Création du plugin : qui est exécuté avant l'appel de chaque page. Ici le plugin réalise juste deux tests
     - SI (l'utilisateur est authentifié) : si ce n'est pas le cas, il est renvoyé vers le controlleur de LoginController ou est affiché un formulaire Login/Password
     - SI (le controlleur + module + action demandé par l'internaute est autorisé). : si ce n'est pas le cas, je le renvoie vers le controlleur par défaut
     - SINON il est redirigé vers la page qu'il a tenté d'acceder

3. Création de la gestion de l'authentification : en fait je n'ai pas fait d'héritage de la classe Auth, alors j'ai une classe batarde LoginAuth qui utilise l'objet Auth. Voilà pourquoi j'ai un objet zend::auth et loginAuth. Cette classe va juste d'une part tester si l'utilisateur peut se connecter sur le site, et d'autre part, si c'est le cas, sauvegarder ses informations (en fait, c'est une gestion de SESSION).

4. La gestion des ACL : qui sont les roles, quelles sont les ressources, quels sont les privilèges, POINT FINAL. Pour moi, les ACL ne font rien d'autre (mais le peu réalisé reste extraordinairement bien fait)

5. ENFIN, le controlleur qui gère l'authentification qui est appelé lors de la connexion sur le site. C'est un simple formulaire Login/Password, rien de plus. J'ai juste deux actions, loginAction, logoutAction.

Dernière modification par whitespirit (28-03-2008 09:05:37)

Hors ligne

 

#12 29-03-2008 10:19:44

zendframwork
Membre
Date d'inscription: 12-01-2008
Messages: 49

Re: comment utiliser Zend_Acl ?

Merci Whitspirit j'ai insisté et Mes "Acl" fonctionne maintennant smile seulement il ne fonctionne que sur les resources "controller" impossible de les faire fonctionner sur des ressources "action" (c'est trés important pour mon projet) ben s'il te plais une idée????
Merci d'avance

Hors ligne

 

#13 31-03-2008 07:40:31

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

Re: comment utiliser Zend_Acl ?

Parceque dans mes Acl, les actions ne sont pas des ressources mais des privilèges. Dans ce code :

Code:

$this->allow('member', 'structure',     'lire');

lire correspond à l'action lireAction, se trouvant dans le module (dc répertoire) /structure/  et structure est la Ressource. Member est évidement le role. Tu remarqueras que dans mon plugin, je n'utilise pas du tout le controlleur (qui en général est toujours le même, cad indexControlleur) car mes acl sont basés sur les actions.

Pour comprendre à qu'est ce que ZF interprete comme $role, $ressource et $privilege, dans le plugin, juste avant cette ligne : if (!$this->_acl->isAllowed($role, $resource, $privilege)) fais un

Code:

echo "role : $role, ressource : $ressource, privilege $privilege, controlleur : $controller"; exit();

Une fois que tu vois ce que t'as dans ces variables, oublie un moment les acl et comment t'aurais fait si tu devais développer le module d'acl qui s'occupe de vérifier si un utilisateur peut acceder à une ressource + privilege ? Avec le echo, vas sur chacune de tes pages et regarde ce que contiens ces valeurs. Une fois que t'as bien compris ce que tu as, tu n'as plus besoin de mon code ou celui de Julien, adapte en fonction de ton cas (c'est ce que j'ai fais).

Pour finir, avant de parler acl, il faut bien définir ce qu'est le rôle (facile, l'utililisateur), la ressource (ce n'est pas forcément un module, ca peut être un fichier, un controlleur ou même une action si j'ai qu'un seul module par défaut) et si j'ai oui ou non un privilège (l'admin peut tout faire, donc pas besoin de définir un privilège pour lui).

Perso, je suis un fan des 'echo/print_r + exit()'.

Hors ligne

 

#14 31-03-2008 10:44:36

zendframwork
Membre
Date d'inscription: 12-01-2008
Messages: 49

Re: comment utiliser Zend_Acl ?

Salut whitspirit!
je te remercie infiniment pour ton aide et tes précieux conseils.
j'ai enfin réussi à faire marcher mes Acl (il était temps!!!).
là je vais n'aventurer sur Zend_search_lucene!
je te dis encore une fois merci et bon code

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