Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
j'ai un petit problème de priorité entre mon acl et Zend_Controller_Router. Quand il n'y a pas de route pas de probléme mon Acl fonctionne pas mal. Mais quand je crée une route pour par exemple /account/active/unevariable à la place de /account/active/id/unevariable c'est la panique coté Acl.
Il semblerai que le problème vienne d'une histoire de class, normalement c'est account mais dans les erreur parfois il me parle de _auth en protected ou private. Je ne comprend pas trop, j'ai donc rajouté dans mon acl les droits pour _account mais il ne veux rien savoir.
Voici le code de mon plugin pour les ACL:
<?php class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $user = Zend_Auth::getInstance(); if($user->hasIdentity()) { $userRoleId = $user->getIdentity()->acl_roleid; } else { $userRoleId = 1; //Visiteur } $acl = My_Acl::getInstance(); $request = $this->getRequest(); if (!$acl->hasRole($userRoleId)) { throw new Exception("Sorry, the requested user role '".$userRoleId."' does not exist"); } if (!$acl->has($request->getModuleName().'_'.$request->getControllerName())) { throw new Exception("Sorry, the requested controller '".$request->getControllerName()."' does not exist as an ACL resource"); } if (!$acl->isAllowed($userRoleId, $request->getModuleName().'_'.$request->getControllerName(), $request->getActionName())) { throw new Exception("Sorry, the page you requested does not exist or you do not have access"); } if (isset($error)) { Zend_Layout::getMvcInstance()->getView()->error = $error; Zend_Layout::getMvcInstance()->getView()->error->Getmessage = "ACL"; $request->setControllerName('error'); $request->setActionName('error'); $request->setDispatched(false); } } }
donc la rien de spécial
mon bootstrap :
<?php if (isset($bootstrap) && $bootstrap) { error_reporting(E_ALL | E_STRICT); ini_set('display_startup_errors', 1); ini_set('display_errors', 1); set_include_path('../library'); require_once "Zend/Loader.php"; Zend_Loader::registerAutoload(); Zend_Loader::loadClass('Zend_Db_Table'); Zend_Loader::loadClass('Zend_Debug'); Zend_Loader::loadClass('Zend_Auth'); Zend_Loader::loadClass('My_Acl'); } //lecture config $config = new Zend_Config_Ini('../application/configs/config.ini', 'general'); Zend_Registry::set('config', $config); $db = Zend_Db::factory($config->db->adapter, $config->db->params->toArray()); Zend_Db_Table::setDefaultAdapter($db); Zend_Registry::set('dbAdapter', $db); $frontController = Zend_Controller_Front::getInstance(); $frontController->setControllerDirectory('../application/controllers'); $route = new Zend_Controller_Router_Route_Regex('account/active/(.+)',array( 1 => 'id', 'controller' =>'account', 'action' =>'active') ); $router = $frontController ->getRouter(); $router ->addRoute('account',$route); $frontController->registerPlugin(new My_Controller_Plugin_Auth()); Zend_Layout::startMvc($config->layout); try { $frontController->dispatch(); } catch (Exception $exception) { // attrape toute exception exit($exception->getMessage()); } //$frontController->throwExceptions(true); date_default_timezone_set('Europe/Paris');
mon Acl.php
<?php class My_Acl extends Zend_Acl { protected static $_instance = null; private function __construct() {} private function __clone() {} protected function _initialize() { $db = Zend_Db_Table::getDefaultAdapter(); $roles = $db->fetchAll("SELECT acl_role_privilege.acl_role_id, acl_module.acl_module_name, acl_resource.acl_resource_name, acl_privilege.acl_privilege_name FROM acl_role_privilege INNER JOIN acl_privilege ON acl_role_privilege.acl_privilege_id = acl_privilege.acl_privilege_id INNER JOIN acl_resource ON acl_privilege.acl_resource_id = acl_resource.acl_resource_id INNER JOIN acl_module ON acl_resource.acl_module_id = acl_module.acl_module_id"); foreach ($roles as $role) { if (!$this->has($role['acl_module_name'].'_'.$role['acl_resource_name'])) { $this->add(new Zend_Acl_Resource($role['acl_module_name'].'_'.$role['acl_resource_name'])); } if (!$this->hasRole($role['acl_role_id'])) { $this->addRole(new Zend_Acl_Role($role['acl_role_id'])); } } $this->deny(); $this->allow(null, 'default_error'); foreach ($roles as $role) { $this->allow($role['acl_role_id'], $role['acl_module_name'].'_'.$role['acl_resource_name'], $role['acl_privilege_name']); } } public static function getInstance() { if (null === self::$_instance) { self::$_instance = new self(); self::$_instance->_initialize(); } return self::$_instance; } }
voici l'erreur ->
An error occurred Sorry, the requested controller 'account' does not exist as an ACL resource Exception information: Message: Sorry, the requested controller 'account' does not exist as an ACL resource Stack trace: #0 /Applications/MAMP/htdocs/zfexemple/trunk/library/Zend/Controller/Plugin/Broker.php(309): My_Controller_Plugin_Auth->preDispatch(Object(Zend_Controller_Request_Http)) #1 /Applications/MAMP/htdocs/zfexemple/trunk/library/Zend/Controller/Front.php(921): Zend_Controller_Plugin_Broker->preDispatch(Object(Zend_Controller_Request_Http)) #2 /Applications/MAMP/htdocs/zfexemple/trunk/application/bootstrap.php(38): Zend_Controller_Front->dispatch() #3 /Applications/MAMP/htdocs/zfexemple/trunk/public/index.php(4): require('/Applications/M...') #4 {main} Request Parameters: array(4) { [1]=> string(15) "rSCRsK8Pqd78wbb" ["controller"]=> string(7) "account" ["action"]=> string(6) "active"
Donc si vous avez une idée je suis partant (le code se trouve dans un git -> http://github.com/damieng/zfpanel/tree/master )
Dernière modification par creatix (12-02-2009 18:13:18)
Hors ligne
Pages: 1