Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
j'ai cette erreur: quand je tente d'afficher :
monsite/connection
ou monsite/chapitre
ou monsite/page
Fatal error: Maximum execution time of 30 seconds exceeded in D:\workspace\library\Zend\Controller\Plugin\Broker.php on line 307
mon acl
<?php class MyAcl extends Zend_Acl { public function __construct() { $this->addRole(new Zend_Acl_Role('guest')); $this->addRole(new Zend_Acl_Role('admin')); //$this->addRole(new Zend_Acl_Role('member'), 'guest'); //$this->addRole(new Zend_Acl_Role('admin'), 'member'); $this->add(new Zend_Acl_Resource('chapitre')); $this->add(new Zend_Acl_Resource('page')); $this->add(new Zend_Acl_Resource('connection')); $this->allow('admin'); $this->deny('guest', 'chapitre', 'voir'); $this->deny('guest', 'page', 'voir'); } } ?>
mon auth
<?php class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract { private $_auth; private $_acl; private $_noagreement = array('module'=>'admin', 'controller'=>'index', 'action'=>'connection'); public function __construct($auth, $acl) { $this->_auth = $auth; $this->_acl = $acl; } public function preDispatch(Zend_Controller_Request_Abstract $request) { if ($this->_auth->hasIdentity()) { $role = $this->_auth->getIdentity()->role; } else { $role = 'guest'; } //echo $this->_acl->isAllowed($role, null, 'voir') ? // "autorisé" : "refusé"; // exit; if ($role == "guest") { $this->_request->setModuleName($this->_noagreement['module']) ->setControllerName($this->_noagreement['controller']) ->setActionName($this->_noagreement['action']) ->setDispatched(true); } } }
Dernière modification par forevermoon (24-04-2009 19:38:55)
Hors ligne
j'ai toujours le probleme
je comprends pas pourquoi cette partie la boucle a l infini ...
if ($this->_acl->isAllowed($role, "chapitre", 'voir')) { } else { $this->_request->setModuleName("admin") ->setControllerName("index") ->setActionName("connection"); }
Hors ligne
ou alors j'ai l'erreur
Fatal error: Maximum execution time of 30 seconds exceeded in D:\workspace\library\Zend\Controller\Action\HelperBroker.php on line 298
Hors ligne
Hello,
Ton plugin est actif pour toute page donc aussi quand tu souhaites accéder à ta page de connexion. Il faut faire une exception pour ta page de connexion.
if ($this->_acl->isAllowed($role, "chapitre", 'voir') || ($this->_request->getModuleName =='admin' && ... )) { } else { $this->_request->setModuleName("admin") ->setControllerName("index") ->setActionName("connection"); }
A+
Hors ligne
merci pour ta réponse ...
mais j'avoue que je vois pas du tout ...
c'est quoi le rapport entre cette ligne que tu as ajouté:
if ($this->_acl->isAllowed($role, "chapitre", 'voir') || ($this->_request->getModuleName =='admin' && ... ))
et une exeption (qui se gere ou ?)
Hors ligne
j'ai bien ecrit dans dans mon acl
$this->add(new Zend_Acl_Resource('connection')); $this->allow('guest', 'connection', 'voir');
Hors ligne
j'ai ecrit ...
if (($this->_acl->isAllowed($role, "chapitre", 'voir')) || (($this->_request->getModuleName =='admin') && ($this->_request->ControllerName =='index') && ($this->_request->ActionName =='connection'))) {
mais cela ne marche pas
Hors ligne
en fait j'ai rien
dans
echo "<br />".$this->_request->getModuleName;
Dernière modification par forevermoon (27-04-2009 10:56:15)
Hors ligne
j'ai corrigé comme cela :
if (($this->_acl->isAllowed($role, "chapitre", 'voir')) || (($request->getModuleName() =='admin') && ($request->getControllerName() =='index') && ($request->getActionName() =='connection'))) { } else { $request->setModuleName("admin") ->setControllerName("index") ->setActionName("connection"); }
et toujours rien
Hors ligne
Hello,
D'accord tu fais :
$this->add(new Zend_Acl_Resource('connection')); $this->allow('guest', 'connection', 'voir');
Moi je ne génère pas d'Acl si je ne suis pas Authentifié donc j'ai besoin de créer l'exception ("|| (($request->getModuleName() =='admin') && ($request->getControllerName() =='index')..."). C'est ça que j'appelais l'exception (pas au sens PHP du terme au sens français ).
Si ton éditeur te propose un mode debug. Il faut y aller pas à pas.
A+
Hors ligne
merci
j'ai bien mis ces 2 lignes dans mon acl ...
$this->add(new Zend_Acl_Resource('connection')); $this->allow('guest', 'connection', 'voir');
hélas toujours une boucle inifini
voila mon acl
<?php class MyAcl extends Zend_Acl { public function __construct() { $this->addRole(new Zend_Acl_Role('guest')); $this->addRole(new Zend_Acl_Role('admin')); //$this->addRole(new Zend_Acl_Role('member'), 'guest'); //$this->addRole(new Zend_Acl_Role('admin'), 'member'); $this->add(new Zend_Acl_Resource('chapitre')); $this->add(new Zend_Acl_Resource('index')); $this->add(new Zend_Acl_Resource('page')); $this->add(new Zend_Acl_Resource('connection')); $this->add(new Zend_Acl_Resource('login')); $this->allow('admin'); $this->allow('guest', 'index', 'voir'); $this->allow('guest', 'connection', 'voir'); $this->deny('guest', 'chapitre', 'voir'); $this->deny('guest', 'page', 'voir'); $this->allow('guest', 'login', 'voir'); } } ?>
le truc c que que "login" est un actionstack appelé dans mon indexcontroller
<?php class Admin_IndexController extends Zend_Controller_Action { public function init() { $this->_helper->layout()->setLayout('admin'); $this->view->num = (int)$this->_request->getParam('num', 0); $user = Zend_Auth::getInstance()->getIdentity(); $this->view->user = $user; if ((isset($user)) && ($user->real_name == "MR admin")) { $this->_helper->actionStack('nav','nav'); } $this->_helper->actionStack('login','login'); }
je me demande si ça vient pas de la ...
Dernière modification par forevermoon (27-04-2009 11:44:36)
Hors ligne
et voila mon auth
<?php class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract { private $_auth; private $_acl; private $_noagreement = array('module'=>'admin', 'controller'=>'index', 'action'=>'connection'); public function __construct($auth, $acl) { $this->_auth = $auth; $this->_acl = $acl; } public function preDispatch(Zend_Controller_Request_Abstract $request) { if ($this->_auth->hasIdentity()) { $role = $this->_auth->getIdentity()->role; } else { $role = 'guest'; } if(($request->getModuleName() =='admin') && ($request->getControllerName() =='index') && ($request->getActionName() =='connection')) { } else { if($this->_acl->isAllowed($role, "chapitre", 'voir')) { } else { $request->setModuleName("admin") ->setControllerName("index") ->setActionName("connection") ->setDispatched(true); } } } }
Hors ligne
voila mon logincontroller
<?php class Admin_loginController extends Zend_Controller_Action { function loginAction() { $this->view->Titre = "login form..."; $this -> _helper -> viewRenderer -> setResponseSegment( 'login' ); $idChapitreGet = (int)$this->_request->getParam('num', 0); $idpageDefault = (int)$this->_request->getParam('idpage', 0); if ($this->_request->isPost()) { $formData = $this->_request->getPost(); $f = new Zend_Filter_StripTags(); $username = $f->filter($this->_request->getPost('login')); $password = $f->filter($this->_request->getPost('pass')); if (empty($username)) { $this->view->message = 'Please provide a username.'; } else { // setup Zend_Auth adapter for a database table $config = new Zend_Config_Ini('./application/config/config.ini', 'prohibiten'); // Zend Objet Base de données $dbAdapter = new Zend_Db_Adapter_Pdo_Mysql(array( 'host' => $config->db->params->host, 'username' => $config->db->params->username, 'password' => $config->db->params->password, 'dbname' => $config->db->params->dbname )); $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authAdapter->setTableName('users'); $authAdapter->setIdentityColumn('username'); $authAdapter->setCredentialColumn('password'); // Set the input credential values to authenticate against $authAdapter->setIdentity($username); $authAdapter->setCredential($password); // do the authentication $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { // success: store database row to auth's storage // system. (Not the password though!) $data = $authAdapter->getResultRowObject(null, 'password'); $auth->getStorage()->write($data); $this->view->message = "ok"; $this->_redirect('/admin'); } else { // failure: clear database row from session $this->view->message = 'Login failed.'; } } } $auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity()) { $form = new Formlogin(); $this->view->form = $this->getForm(); } } function logoutAction() { Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/admin/index/connection'); } public function getForm() { return new FormLogin(array( 'action' => "", 'method' => 'post', )); } }
Hors ligne
Hello,
Ton Acl est chargé quand ? Dans ton bootstrap ?
A+
Hors ligne
voila le bootstrap
<?php error_reporting(E_ALL|E_STRICT); ini_set('display_errors', 1); date_default_timezone_set('Europe/Paris'); // mise en place des répertoires et chargement des classes set_include_path('.' . PATH_SEPARATOR . './library' . PATH_SEPARATOR . './application/models/' . PATH_SEPARATOR . get_include_path()); include "Zend/Loader.php"; Zend_Loader::registerAutoload(); define("REPIMAGE", "/workspace/www/images/"); // Chargement de la configuration //$config = new Zend_Config_Ini('./application/config.ini', 'general'); $config = new Zend_Config_Ini('./application/config/config.ini', 'maconfig'); $db = Zend_Db::factory($config->db->adapter,array( 'host' => $config->db->host, 'username' => $config->db->username, 'password' => $config->db->password, 'dbname' => $config->db->dbname, ) ); $registry = Zend_Registry::getInstance(); $registry->set('config', $config); $registry->set('db', $db); // Mise en place de la BDD $db = Zend_Db::factory($config->db); Zend_Db_Table::setDefaultAdapter($db); // $auth = Zend_Auth::getInstance(); $acl = new MyAcl($auth); // setup controller $frontController = Zend_Controller_Front::getInstance(); $frontController->registerPlugin(new My_Controller_Plugin_ModuleSetup()); $frontController->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array( 'module' => 'site', 'controller' => 'error', 'action' => 'error' ))); $frontController->registerPlugin(new My_Plugin_Auth($auth, $acl)); $frontController->setBaseUrl(); $frontController->addModuleDirectory('./application/modules'); $frontController->setDefaultModule("site"); $frontController->setControllerDirectory(array('site'=> './application/modules/site/controllers','admin'=> './application/modules/admin/controllers')); $actionStack = Zend_Controller_Action_HelperBroker::getStaticHelper('actionStack'); $config = new Zend_Config_Ini('./application/config/layout.ini', 'site'); $layout = Zend_Layout::startMvc($config); $layout = Zend_Layout::getMvcInstance(); // run! $frontController->throwExceptions(false); try { $frontController->dispatch(); } catch(Exception $e) { echo nl2br($e->__toString()); }
Hors ligne
ma fonction predispacth
public function preDispatch(Zend_Controller_Request_Abstract $request) { if ($this->_auth->hasIdentity()) { $role = $this->_auth->getIdentity()->role; } else { $role = 'guest'; } if(($request->getModuleName() =='admin') && ($request->getControllerName() =='index') && ($request->getActionName() =='connection')) { } else { if($this->_acl->isAllowed($role, "chapitre", 'voir')) { } else { $request->setModuleName("admin") ->setControllerName("index") ->setActionName("connection") ->setDispatched(true); } } }
ca boucle ca boucle ... je suis perplexe
je suis sur d'avoir tout bien fait ...
Hors ligne
J'essai de comprendre un truc..
Lorsqu'on est pas identifié, tu rediriges vers admin/index/connection
de plus, toutes tes actions admin/* sont suivies de (via actionstack dans init) de l'appel à l'action 'login'.
Est-ce que cette cette action 'login' est aussi autorisé à guest ??
Si elle ne l'est pas, ton predispatch modifie la requète et donc, tu repasses dans amdin/index/connection, qui replace login dans l'actionstack, ....
Dernière modification par nORKy (27-04-2009 12:58:01)
Hors ligne
oui je redirige vers "admin/index/connection " parce que c'est cette page qui me donne le formulaire d'authentification ...
j'ai autorisé dans mon acl
$this->add(new Zend_Acl_Resource('login')); $this->allow('guest', 'login', 'voir');
c'est pour ça je comprends pas pkoi ça passe pas ...
mon logincontroller :
<?php class Admin_loginController extends Zend_Controller_Action { function loginAction() { $this->view->Titre = "login form..."; $this -> _helper -> viewRenderer -> setResponseSegment( 'login' ); $idChapitreGet = (int)$this->_request->getParam('num', 0); $idpageDefault = (int)$this->_request->getParam('idpage', 0); if ($this->_request->isPost()) { $formData = $this->_request->getPost(); $f = new Zend_Filter_StripTags(); $username = $f->filter($this->_request->getPost('login')); $password = $f->filter($this->_request->getPost('pass')); if (empty($username)) { $this->view->message = 'Please provide a username.'; } else { // setup Zend_Auth adapter for a database table $config = new Zend_Config_Ini('./application/config/config.ini', 'prohibiten'); // Zend Objet Base de données $dbAdapter = new Zend_Db_Adapter_Pdo_Mysql(array( 'host' => $config->db->params->host, 'username' => $config->db->params->username, 'password' => $config->db->params->password, 'dbname' => $config->db->params->dbname )); $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authAdapter->setTableName('users'); $authAdapter->setIdentityColumn('username'); $authAdapter->setCredentialColumn('password'); // Set the input credential values to authenticate against $authAdapter->setIdentity($username); $authAdapter->setCredential($password); // do the authentication $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { // success: store database row to auth's storage // system. (Not the password though!) $data = $authAdapter->getResultRowObject(null, 'password'); $auth->getStorage()->write($data); $this->view->message = "ok"; $this->_redirect('/admin'); } else { // failure: clear database row from session $this->view->message = 'Login failed.'; } } } $auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity()) { $form = new Formlogin(); $this->view->form = $this->getForm(); } } function logoutAction() { Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/admin/index/connection'); } public function getForm() { return new FormLogin(array( 'action' => "", 'method' => 'post', )); } }
Hors ligne
oui, mais dans ton code, tu tests if($this->_acl->isAllowed($role, "chapitre", 'voir'))
hors, quand ton actionStack charge 'login', forcement, ta condition est fausse puisque tu testes chapitres/voir et forcement, comme tu es guest, tu repasses dans la redirection
Il faut tester la requète courante, et pas chapitre/voir
Dernière modification par nORKy (27-04-2009 14:25:31)
Hors ligne
ok ok mais je suis encore perplexe parce que c bien l'action "chapitre" que je veux tester ...
mince je suis embéter ma structure n'est pas bonne ?
je comprends pas bien ce qu'il se passe ...
je suis dans un cas particulier ?
Dernière modification par forevermoon (27-04-2009 14:34:57)
Hors ligne
bon merci pour cette piste
j'ai sorti mon action login de l'actionstack ...
je le gere directement en tant qu'action à part entiere dans mon indexcontroller
ça semble mieux ... et moins casse tête ...
en tout cas merci ... pour cette réponse ...
Hors ligne
tu veux testé chapitre ?? c'est bizarre ca !
Alors si je vais sur la page toto, c'est quand même chapitre qui est testé ?
T'as pas un problème de logique de conception par hasard ? ou alors, on ne se comprend vraiment pas
Si t'as besoin d'un exemple, dit le moi
Hors ligne
heu .... je teste chapitre juste si quelqu'un qui n'est pas identifié tente d 'exécuter cette page ...
mais le test bien sur je le fais sur toutes les pages que je veux mettre derrière l'authentification
je parlais de chapitre juste pour l'exemple ... apres j'ai addchapitre editchapitre delchapitre ...
j'ai changé ma structure ... avant j'avais login dans un actionstack dans l init de l indexcontroller
mais ça coinçait alors j'ai sorti login pour le mettre directement dans l indexcontroler en tant qu'action ...
j'ai trouvé que cette solution pour que le plugin fonctionne, apparement les actionstack passe pas avec le plugin auth
Dernière modification par forevermoon (28-04-2009 11:24:05)
Hors ligne