Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-02-2009 18:08:11

creatix
Membre
Date d'inscription: 03-08-2008
Messages: 17

Priorité entre Zend_Acl et Zend_Controller_Router

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:

Code:

<?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 :

Code:

<?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

Code:

<?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 ->

Code:

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 smile (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

 

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