Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 :
<?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 :
[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 :
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 :
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 :
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
Je m'auto réponds, j'avais ajouté deux s à resource .... lamentable !
Hors ligne
Salut, t'es bon en orthographe, moins en anglais
En tous cas merci, ça va m'aider !
Hors ligne
héhé, c'est tout à fait ça !
Hors ligne