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