Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 08-09-2010 16:29:06

erehcab
Membre
Date d'inscription: 17-11-2009
Messages: 63

Couplé Zend_Acl et Zend_Navigation

Bonjour à tous j'essaie de coupler Zend_Acl avec Zend_Navigation afin que mes éléments de menu disparaissent si un utilisateur n'a pas le droit d'accès. Après plusieurs testes les éléments du menu restent toujours apparent ... Par contre si je clique dessus et que je n'ai pas l'authorisation d'y accéder et je suis bien rediriger vers la page souhaitée (Mes acl fonctionnent mais pas le couplage avec zend_navigation) !

Je poste les classes concernées, si quelqu'un peut regarder pour me donner son avis ça m'aiderait beaucoup !

Pour info sur l'architecture j'ai déployé mon projet Zend avec Zend_Tool.

Voilà le fichier de config du menu :

Code:

<?xml version="1.0" encoding="UTF-8"?>
    <configdata>
        <nav>
            <Whoareus>
                <label>Who are us</label>
                <controller>Whoareus</controller>
                <action>index</action>
                <ressource>Whoareus</ressource>
            </Whoareus>
            <Auth>
                <label>Connection</label>
                <controller>Auth</controller>
                <action>index</action>
                <ressource>Auth</ressource>
            </Auth>
            <Howitswork>
                <label>How it's work</label>
                <controller>Howitswork</controller>
                <action>index</action>
                <ressource>Howitswork</ressource>
            </Howitswork>
            <Howfindkellook>
                <label>How find kellook</label>
                <controller>Howfindkellook</controller>
                <action>index</action>
                <ressource>Howfindkellook</ressource>
            </Howfindkellook>
            <Ourpartners>
                <label>Our partners</label>
                <controller>Ourpartners</controller>
                <action>index</action>
                <ressource>Ourpartners</ressource>
            </Ourpartners>
            <Cgv>
                <label>CGV</label>
                <controller>Cgv</controller>
                <action>index</action>
                <ressource>Cgv</ressource>
            </Cgv>
            <Customersservices>
                <label>Customers services</label>
                <controller>Customersservices</controller>
                <action>index</action>
                <ressource>Customersservices</ressource>
            </Customersservices>
            <Security>
                <label>Security</label>
                <controller>Security</controller>
                <action>index</action>
                <ressource>Security</ressource>
            </Security>
            <Contact>
                <label>Contact</label>
                <controller>Contact</controller>
                <action>index</action>
                <ressource>Contact</ressource>
            </Contact>
            <Blog>
                <label>Blog</label>
                <controller>Blog</controller>
                <action>index</action>
                <ressource>Blog</ressource>
            </Blog>
            <Press>
                <label>Press</label>
                <controller>Press</controller>
                <action>index</action>
                <ressource>Press</ressource>
            </Press>
        </nav>
    </configdata>

Le fichier de config des acl :

Code:

[roles]

Guest = null
User = null

[ressources]

index = null
auth = null
Whoareus = null
Howitswork = null
Howfindkellook = null
Ourpartners = null
Cgv = null
Customersservices = null
Security = null
Contact = null
Blog = null
Press = null

[Guest]

allow.index = null
allow.auth = null
allow.Whoareus = null
deny.Howitswork = null
allow.Howfindkellook = null
allow.Ourpartners = null
allow.Cgv = null
allow.Customersservices = null
allow.Security = null
allow.Contact = null
allow.Blog = null
allow.Press = null

[User]

allow.index = null
allow.auth = null
allow.Whoareus = null
allow.Howitswork = null
allow.Howfindkellook = null
allow.Ourpartners = null
allow.Cgv = null
allow.Customersservices = null
allow.Security = null
allow.Contact = null
allow.Blog = null
allow.Press = null

le bootstrap :

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    
    private $_acl = null;
    private $_auth = null;
    private $_role = null;
    
    protected function _initAutoload()
    {
        
        new Zend_Application_Module_Autoloader(array(
                'namespace' => '',
                'basePath'  => APPLICATION_PATH,
        ));
        
        $this->_acl = new Sheraf_Acl(APPLICATION_PATH . '/configs/acl.ini');
        $this->_auth = Zend_Auth::getInstance();
        
        if ($this->_auth->hasIdentity()) $this->_role = $this->_auth->getStorage()->read()->role;
        else $this->_role = 'Guest';

    }
        
    protected function _initAcl()
    {
        
        $front = Zend_Controller_Front::getInstance();
        $front->registerPlugin(new Sheraf_Controller_Plugin_Auth($this->_acl, $this->_auth));
        
    }
    
    protected function _initNavigation()    
    {
        
        $view = $this->bootstrap('layout')->getResource('layout')->getView();
        $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
        $view->navigation(new Zend_Navigation($config))->setAcl($this->_acl)->setRole($this->_role);
        
    }
        
}

La classe de création des rôles et des ressources depuis le fichier de config des acl :

Code:

class Sheraf_Acl 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 la classe d'authentification :

Code:

class Sheraf_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     = 'login';
    const FAIL_AUTH_ACTION     = 'login';
    const FAIL_AUTH_CONTROLLER = 'auth';
    
    /**
     * Chemin de redirection lors de l'échec de contrôle des privilèges
     */
    const FAIL_ACL_MODULE     = 'login';
    const FAIL_ACL_ACTION     = 'login';
    const FAIL_ACL_CONTROLLER = 'auth';
    
    /**
     * Constructeur
     */
    public function __construct(Zend_Acl $acl, Zend_Auth $auth)    {
        $this->_acl  = $acl ;
        $this->_auth = $auth ;
    }
    
    /**
     * 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) ;
    }
}

Dernière modification par erehcab (08-09-2010 16:48:57)

Hors ligne

 

#2 10-09-2010 11:39:52

erehcab
Membre
Date d'inscription: 17-11-2009
Messages: 63

Re: Couplé Zend_Acl et Zend_Navigation

Je m'auto réponds, j'avais ajouté deux s à resource .... lamentable !

Hors ligne

 

#3 09-09-2011 06:35:00

nk34
Membre
Date d'inscription: 10-08-2011
Messages: 32

Re: Couplé Zend_Acl et Zend_Navigation

Salut, t'es bon en orthographe, moins en anglais wink

En tous cas merci, ça va m'aider !

Hors ligne

 

#4 09-09-2011 09:24:01

erehcab
Membre
Date d'inscription: 17-11-2009
Messages: 63

Re: Couplé Zend_Acl et Zend_Navigation

héhé, c'est tout à fait ça !

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