Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-06-2011 23:45:57

zakaria340
Nouveau membre
Date d'inscription: 10-06-2011
Messages: 4

probléme pour mettre en place Zend_acl avec zend_auth

Bonjour

J'essaye de mettre en place zend_acl et la gestion de droit mais je rencontre plusieurs problémes a comprendre comment ça fonctionne

j'ai trouvé 2 tutorial Zend_Acl / Zend_Auth scénario d'exemple dans developpez.com et ce tutorial http://www.wowww.ch/index.php?post/2008 … -Zend-Acl.

le problème c'est que je sais pas ou mettre les classe My_Acl_Ini, My_Controller_Plugin_Auth

j'aimerai bien avoir quelque explication sur les étapes que je doit suivre et dans quel fichier je doit mettre les codes, ou si quelqu’un à un lien pour un autre tutorial .

Merci d'avance

Hors ligne

 

#2 22-06-2011 08:16:35

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: probléme pour mettre en place Zend_acl avec zend_auth

Il y a un webinar à ce sujet sur le site de ZF il me semble. Sinon pouf les classes de ce type il faut logiquement (après rien d'obligatoire), créer un dossier 'My' dans library (puis My/Acl et My/Controller)

Hors ligne

 

#3 22-06-2011 10:37:01

zakaria340
Nouveau membre
Date d'inscription: 10-06-2011
Messages: 4

Re: probléme pour mettre en place Zend_acl avec zend_auth

Merci shadypierre pour ta réponse et voila ce que j'ai fait d'apres ce tutorial :

http://www.wowww.ch/index.php?post/2008 … t-Zend-Acl

j'ai défini mes roles et mes ressource dans un fichier .ini que je l'ai mis dans mon dossier configs,

acl.ini

Code:

[roles]  
  
guest = null  
member = null  
admin = null  
  
[ressources]  
  
; définition des ressources dans le module par défaut  
index    = null  
affectation   = null  
mouvements = null  
configurations = null  
reporting = null  
admin = null
 
  
[guest]  
  
allow.index    = null  
allow.reporting = null 
  
; member hérite de guest  
[member : guest]  
  
; on interdit le login (le membre est déjà identifié)  
deny.login   = null  
allow.affectation = null  
allow.configurations = null 
allow.mouvements = null 
  
; admin hérite de member  
[admin : member]  
  
allow.admin = null

apres j'ai ajouter un repertoire dans library My ou j'ai crée 2 classes

My_Controller_Plugin_Auth.php

Code:

<?php
/**
 * Plugin d'authentification
 * 
 * Largement inspiré de :
 * http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/auth-http/?page=modele-MVC
**/

class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract    {
    /**
     * @var Zend_Auth instance 
     */
    private $_auth;
    
    /**
     * @var Zend_Acl instance 
     */
    private $_acl;
    
    /**
     * Chemin de redirection lors de l'échec d'authentification
     */
    const FAIL_AUTH_MODULE     = 'default';
    const FAIL_AUTH_ACTION     = 'index';
    const FAIL_AUTH_CONTROLLER = 'account';
    
    /**
     * Chemin de redirection lors de l'échec de contrôle des privilèges
     */
    const FAIL_ACL_MODULE     = 'default';
    const FAIL_ACL_ACTION     = 'privileges';
    const FAIL_ACL_CONTROLLER = 'error';
    
    /**
     * Constructeur
     */
    public function __construct(Zend_Acl $acl)    {
        $this->_acl  = $acl ;
        $this->_auth = Zend_Auth::getInstance() ;
    }
    
    /**
     * Vérifie les autorisations
     * Utilise _request et _response hérités et injectés par le FC
     */
    public function preDispatch(Zend_Controller_Request_Abstract $request)    {
        // is the user authenticated
        if ($this->_auth->hasIdentity()) {
          // yes ! we get his role
          $user = $this->_auth->getStorage()->read() ;
          $role = $user['role'] ;
        } else {
          // no = guest user
          $role = 'guest';
        }
        
        $module     = $request->getModuleName() ;
        $controller = $request->getControllerName() ;
        $action     = $request->getActionName() ;
        
        $front = Zend_Controller_Front::getInstance() ;
        $default = $front->getDefaultModule() ;
        
        // compose le nom de la ressource
        if ($module == $default)    {
            $resource = $controller ;
        } else {
            $resource = $module.'_'.$controller ;
        }
    
        // est-ce que la ressource existe ?
        if (!$this->_acl->has($resource)) {
          $resource = null;
        }
        
        // contrôle si l'utilisateur est autorisé
        if (!$this->_acl->isAllowed($role, $resource, $action)) {
            // l'utilisateur n'est pas autorisé à accéder à cette ressource
            // on va le rediriger
            if (!$this->_auth->hasIdentity()) {
                // il n'est pas identifié -> module de login
                $module = self::FAIL_AUTH_MODULE ;
                $controller = self::FAIL_AUTH_CONTROLLER ;
                $action = self::FAIL_AUTH_ACTION ;
            } else {
                // il est identifié -> error de privilèges
                $module = self::FAIL_ACL_MODULE ;
                $controller = self::FAIL_ACL_CONTROLLER ;
                $action = self::FAIL_ACL_ACTION ;
            }
        }

        $request->setModuleName($module) ;
        $request->setControllerName($controller) ;
        $request->setActionName($action) ;
    }
}

\\ My_Acl_Ini.php

Code:

<?php
/**
 * Classe de création des ACL via un fichier de configuration INI
**/

class My_Acl_Ini extends Zend_Acl    {
    public function __construct($file)    {
        $roles = new Zend_Config_Ini($file, 'roles') ;
        $this->_setRoles($roles) ;
        
        $ressources = new Zend_Config_Ini($file, 'ressources') ;
        $this->_setRessources($ressources) ;
        
        foreach ($roles->toArray() as $role => $parents)    {
            $privileges = new Zend_Config_Ini($file, $role) ;
            $this->_setPrivileges($role, $privileges) ;
        }
    }
    
    protected function _setRoles($roles)    {
        foreach ($roles as $role => $parents)    {
            if (empty($parents))    {
                $parents = null ;
            } else {
                $parents = explode(',', $parents) ;
            }

            $this->addRole(new Zend_Acl_Role($role), $parents);
        }
        
        return $this ;
    }

    protected function _setRessources($ressources)    {
        foreach ($ressources as $ressource => $parents)    {
            if (empty($parents))    {
                $parents = null ;
            } else {
                $parents = explode(',', $parents) ;
            }

            $this->add(new Zend_Acl_Resource($ressource), $parents);
        }
        
        return $this ;
    }

    protected function _setPrivileges($role, $privileges)    {
        foreach ($privileges as $do => $ressources)    {
            foreach ($ressources as $ressource => $actions)    {
                if (empty($actions))    {
                    $actions = null ;
                } else {
                    $actions = explode(',', $actions) ;
                }
                
                $this->{$do}($role, $ressource, $actions);
            }
        }
        
        return $this ;
    }
}

et voila ce que j'ai ajouter a mon fichier Boostrap.php :

    $acl_ini = '../config/acl.ini' ; 
    $acl     = new My_Acl_Ini($acl_ini) ; 


Code:

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    protected function _initAutoload()
    {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH));
            
        return $moduleLoader;

                    
    $acl_ini = '../config/acl.ini' ;  
$acl     = new My_Acl_Ini($acl_ini) ;
$front->registerPlugin(new My_Controller_Plugin_Auth($acl)) ; 
    }
    
    
    protected function _initViewHelpers()
{
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $view->doctype('XHTML1_STRICT');
    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
    $view->headTitle()->setSeparator(' - ');
    $view->headTitle('Application CDG Gestion de Stock');
}
.......

Apres qu'est ce que je doit ajouter dans ma fonction login ????????

Hors ligne

 

#4 22-06-2011 14:22:34

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: probléme pour mettre en place Zend_acl avec zend_auth

Dans un 1er temps quand tu dis

apres j'ai ajouter un repertoire dans library My ou j'ai crée 2 classes

as tu bien ceci :
- Library/My/Acl/Ini.php ?
- Library/My/Controller/Plugin/Auth.php ?

Ensuite, dans ton bootstrap tu sors ceci du (cf : ci dessous) _initLoader()

Code:

[lang=php]$acl_ini = '../config/acl.ini' ;  
$acl     = new My_Acl_Ini($acl_ini) ;
$front->registerPlugin(new My_Controller_Plugin_Auth($acl)) ;

Tu ajoute ceci a la place :

Code:

[lang=php]
Zend_Loader_Autoloader::getInstance()->registerNamespace('MY')
                                                          ->getRegisteredNamespaces();

Et enfin tu ajoute une fonction dans ton bootstrap pour les ACL

Code:

[lang=php]
protected function _initAcl()
    {
        // plugin Acl/Auth
        $acl_ini = APPLICATION_PATH . '/configs/acl.ini' ;
        $acl     = new MY_Acl_Ini($acl_ini);
        Zend_Controller_Front::getInstance()->registerPlugin(new MY_Controller_Plugins_Auth($acl));
        Zend_Registry::set('Zend_Acl', $acl);
    }

Dernière modification par shadypierre (22-06-2011 14:23:17)

Hors ligne

 

#5 22-06-2011 23:35:21

tdutrion
Administrateur
Lieu: Dijon, Paris, Edinburgh
Date d'inscription: 23-12-2009
Messages: 614
Site web

Re: probléme pour mettre en place Zend_acl avec zend_auth

Bonjour,

Juste un ajout : l'autoload par défaut prends en charge le chargement des classes de plugin contenues dans le répertoire /application/plugins

Hors ligne

 

#6 30-06-2011 10:18:26

magnan
Nouveau membre
Date d'inscription: 24-09-2008
Messages: 5

Re: probléme pour mettre en place Zend_acl avec zend_auth

J'ai reproduit l'exemple proposé dans le forum. Je n'obtiens aucun résultat et aucun affichage.
Merci par avance de m'indiquer les erreurs dans les scripts ci-dessous.
Ci dessous la structure de l'application (répertoires et scripts) :

Code:

test_acl
    application
        controllers
        layouts
        models
        views
        acl.ini
        bootstrap.php
        config.ini
        
    library
        My
            Acl
                Ini.php
            Controller
                Plugin
                    Auth.php
        Zend
    public
        css
        js
        images
        index.php
        .htaccess

Ci dessous le contenu des différents scripts :

-------------------------------------------------------------------
index.php

Code:

[lang=php]

<?php

error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/London');

// directory setup and class loading
set_include_path('.' . PATH_SEPARATOR . '../library/'
//     . PATH_SEPARATOR . '../application/models'
     . PATH_SEPARATOR . get_include_path());

$appPath  = dirname(__FILE__);
$rootPath = dirname($appPath);

set_include_path(get_include_path() . PATH_SEPARATOR .
                 $rootPath . '/application/models/' . PATH_SEPARATOR
                 );

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'general'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/config.ini'
);

$application->bootstrap()
            ->run();

-------------------------------------------------------------------
Bootstrap.php   

Code:

[lang=php]
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    protected function _initAutoload()
    {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath' => APPLICATION_PATH));
            
        return $moduleLoader;
        Zend_Loader_Autoloader::getInstance()->registerNamespace('MY')

    }

    protected function _initAcl()
    {
        // plugin Acl/Auth
        $acl_ini = APPLICATION_PATH . 'acl.ini' ;
        $acl     = new MY_Acl_Ini($acl_ini);
        Zend_Controller_Front::getInstance()->registerPlugin(new MY_Controller_Plugins_Auth($acl));
        Zend_Registry::set('Zend_Acl', $acl);
    }


    protected function _initViewHelpers()
    {
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $view->doctype('XHTML1_STRICT');
    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
    $view->headTitle()->setSeparator(' - ');
    $view->headTitle('Application CDG Gestion de Stock');
    }
}

-------------------------------------------------------------------
Auth.php

Code:

[lang=php]
<?php
/**
 * Plugin d'authentification
 * 
 * Largement inspiré de :
 * http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/auth-http/?page=modele-MVC
**/

class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract    {
    /**
     * @var Zend_Auth instance 
     */
    private $_auth;
    
    /**
     * @var Zend_Acl instance 
     */
    private $_acl;
    
    /**
     * Chemin de redirection lors de l'échec d'authentification
     */
    const FAIL_AUTH_MODULE     = 'default';
    const FAIL_AUTH_ACTION     = 'index';
    const FAIL_AUTH_CONTROLLER = 'account';
    
    /**
     * Chemin de redirection lors de l'échec de contrôle des privilèges
     */
    const FAIL_ACL_MODULE     = 'default';
    const FAIL_ACL_ACTION     = 'privileges';
    const FAIL_ACL_CONTROLLER = 'error';
    
    /**
     * Constructeur
     */
    public function __construct(Zend_Acl $acl)    {

        $this->_acl  = $acl ;
        $this->_auth = Zend_Auth::getInstance() ;
    }
    
    /**
     * Vérifie les autorisations
     * Utilise _request et _response hérités et injectés par le FC
     */
    public function preDispatch(Zend_Controller_Request_Abstract $request)    {
        // is the user authenticated
        if ($this->_auth->hasIdentity()) {
          // yes ! we get his role
          $user = $this->_auth->getStorage()->read() ;
          $role = $user['role'] ;
        } else {
          // no = guest user
          $role = 'guest';
        }
        
        $module     = $request->getModuleName() ;
        $controller = $request->getControllerName() ;
        $action     = $request->getActionName() ;
        
        $front = Zend_Controller_Front::getInstance() ;
        $default = $front->getDefaultModule() ;
        
        // compose le nom de la ressource
        if ($module == $default)    {
            $resource = $controller ;
        } else {
            $resource = $module.'_'.$controller ;
        }
    
        // est-ce que la ressource existe ?
        if (!$this->_acl->has($resource)) {
          $resource = null;
        }
        
        // contrôle si l'utilisateur est autorisé
        if (!$this->_acl->isAllowed($role, $resource, $action)) {
            // l'utilisateur n'est pas autorisé à accéder à cette ressource
            // on va le rediriger
            if (!$this->_auth->hasIdentity()) {
                // il n'est pas identifié -> module de login
                $module = self::FAIL_AUTH_MODULE ;
                $controller = self::FAIL_AUTH_CONTROLLER ;
                $action = self::FAIL_AUTH_ACTION ;
            } else {
                // il est identifié -> error de privilèges
                $module = self::FAIL_ACL_MODULE ;
                $controller = self::FAIL_ACL_CONTROLLER ;
                $action = self::FAIL_ACL_ACTION ;
            }
        }

        $request->setModuleName($module) ;
        $request->setControllerName($controller) ;
        $request->setActionName($action) ;
    }
}

-------------------------------------------------------------------
Ini.php

Code:

[lang=php]
<?php
/**
 * Classe de création des ACL via un fichier de configuration INI
**/

class My_Acl_Ini extends Zend_Acl    {
    public function __construct($file)    {
        $roles = new Zend_Config_Ini($file, 'roles') ;
        $this->_setRoles($roles) ;
        
        $ressources = new Zend_Config_Ini($file, 'ressources') ;
        $this->_setRessources($ressources) ;
        
        foreach ($roles->toArray() as $role => $parents)    {
            $privileges = new Zend_Config_Ini($file, $role) ;
            $this->_setPrivileges($role, $privileges) ;
        }
    }
    
    protected function _setRoles($roles)    {
        foreach ($roles as $role => $parents)    {
            if (empty($parents))    {
                $parents = null ;
            } else {
                $parents = explode(',', $parents) ;
            }

            $this->addRole(new Zend_Acl_Role($role), $parents);
        }
        
        return $this ;
    }

    protected function _setRessources($ressources)    {
        foreach ($ressources as $ressource => $parents)    {
            if (empty($parents))    {
                $parents = null ;
            } else {
                $parents = explode(',', $parents) ;
            }

            $this->add(new Zend_Acl_Resource($ressource), $parents);
        }
        
        return $this ;
    }

    protected function _setPrivileges($role, $privileges)    {
        foreach ($privileges as $do => $ressources)    {
            foreach ($ressources as $ressource => $actions)    {
                if (empty($actions))    {
                    $actions = null ;
                } else {
                    $actions = explode(',', $actions) ;
                }
                
                $this->{$do}($role, $ressource, $actions);
            }
        }
        
        return $this ;
    }
}

Dernière modification par magnan (30-06-2011 11:44:00)

Hors ligne

 

#7 30-06-2011 10:58:18

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: probléme pour mettre en place Zend_acl avec zend_auth

Pourrais-tu éditer ton message afin d'utiliser les balises de code :

[ code][lang=php]code ici[/ code]

Merci d'avance wink

Dernière modification par shadypierre (30-06-2011 10:58:56)

Hors ligne

 

#8 17-09-2011 10:24:43

Hirogens
Nouveau membre
Date d'inscription: 17-07-2011
Messages: 1

Re: probléme pour mettre en place Zend_acl avec zend_auth

Bonjour,

Quelqu'un aurait-il plus simplement un petit Zip, avec un exemple qui contient un implémentation
de Zend_Auth et Zend_Acl.

Car tout ce que je trouve, soit ne marche pas ou n'est pas complet.

Merci d'avance.

Cordialement

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