Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-04-2009 19:13:40

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

erreur de dispatch acl ou auth ??

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

Code:

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

Code:

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

 

#2 27-04-2009 10:22:49

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

j'ai toujours le probleme
je comprends pas pourquoi cette partie la boucle a l infini ...

Code:

if ($this->_acl->isAllowed($role, "chapitre", 'voir')) {
}
else
{
                           
$this->_request->setModuleName("admin")
                           ->setControllerName("index")
                           ->setActionName("connection"); 
}

Hors ligne

 

#3 27-04-2009 10:25:36

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

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

 

#4 27-04-2009 10:33:21

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: erreur de dispatch acl ou auth ??

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.

Code:

if ($this->_acl->isAllowed($role, "chapitre", 'voir') || ($this->_request->getModuleName =='admin' && ... )) {
}
else
{
                           
$this->_request->setModuleName("admin")
                           ->setControllerName("index")
                           ->setActionName("connection"); 
}

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#5 27-04-2009 10:44:00

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

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

Code:

if ($this->_acl->isAllowed($role, "chapitre", 'voir') || ($this->_request->getModuleName =='admin' && ... ))

et une exeption (qui se gere ou ?)

Hors ligne

 

#6 27-04-2009 10:45:25

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

j'ai bien ecrit dans  dans mon acl

Code:

        $this->add(new Zend_Acl_Resource('connection'));
                $this->allow('guest', 'connection', 'voir');

Hors ligne

 

#7 27-04-2009 10:51:48

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

j'ai ecrit ...

Code:

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

 

#8 27-04-2009 10:55:24

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

en fait j'ai rien
dans

echo "<br />".$this->_request->getModuleName;

Dernière modification par forevermoon (27-04-2009 10:56:15)

Hors ligne

 

#9 27-04-2009 11:12:55

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

j'ai corrigé comme cela :

Code:

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

 

#10 27-04-2009 11:21:37

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: erreur de dispatch acl ou auth ??

Hello,

D'accord tu fais :

Code:

$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 big_smile ).

Si ton éditeur te propose un mode debug. Il faut y aller pas à pas.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#11 27-04-2009 11:29:59

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

merci
j'ai bien mis ces 2 lignes dans mon acl ...

Code:

$this->add(new Zend_Acl_Resource('connection'));
$this->allow('guest', 'connection', 'voir');

hélas toujours une boucle inifini

voila mon acl

Code:

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

Code:

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

 

#12 27-04-2009 11:42:31

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

et voila mon auth

Code:

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

 

#13 27-04-2009 11:45:02

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

voila mon logincontroller

Code:

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

 

#14 27-04-2009 11:55:06

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: erreur de dispatch acl ou auth ??

Hello,

Ton Acl est chargé quand ? Dans ton bootstrap ?

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#15 27-04-2009 11:56:41

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

voila le bootstrap

Code:

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

 

#16 27-04-2009 11:58:26

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

ma fonction predispacth

Code:

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

 

#17 27-04-2009 12:56:33

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: erreur de dispatch acl ou auth ??

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)


----
Gruiiik !

Hors ligne

 

#18 27-04-2009 14:09:03

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

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

Code:

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

Code:

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

 

#19 27-04-2009 14:24:28

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: erreur de dispatch acl ou auth ??

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)


----
Gruiiik !

Hors ligne

 

#20 27-04-2009 14:34:45

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

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

 

#21 27-04-2009 15:10:17

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

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

 

#22 27-04-2009 20:25:04

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: erreur de dispatch acl ou auth ??

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 smile

Si t'as besoin d'un exemple, dit le moi


----
Gruiiik !

Hors ligne

 

#23 28-04-2009 11:22:26

forevermoon
Membre
Date d'inscription: 10-04-2009
Messages: 45

Re: erreur de dispatch acl ou auth ??

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

 

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