Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 15-08-2010 22:19:40

z3d
Nouveau membre
Date d'inscription: 15-08-2010
Messages: 3

[Résolu] Problème étrange avec Zend_Acl

Bien le bonsoir à tous les lecteurs smile

Ce soir, je me retrouve confronté à un bug étrange concernant le composant Zend_Acl celui-ci me bloque une partie d'un controller, notamment les actions de vérification de formulaire (peut être est-ce juste une coïncidence mais j'en doute).

J'ai 4 rôles guest, member, customer, admin chacun héritant de celui qui le précède.
J'ai 3 modules frontend, backend, gp.

Le gp est accessible par customer et admin avec pour règles :

[customer : member]
gp_index = null
gp_error = null
gp_test = null

[admin : customer]
backend_index = null

Une fois authentifié en admin j'ai bien accès à pratiquement tout le gp sauf lorsque je soumets un formulaire du controller test...
L'action est inaccessible et me redirige vers l'accueil avec pour message d'erreur, un défaut de privilège.

Comment cela est-ce possible ?
Avez-vous déjà été confronté à ce type de bug ?

Je vous remercie par avance pour vos réponses et suis preneur pour tout retour d'expérience.

Dernière modification par z3d (16-08-2010 16:03:29)

Hors ligne

 

#2 16-08-2010 15:53:40

z3d
Nouveau membre
Date d'inscription: 15-08-2010
Messages: 3

Re: [Résolu] Problème étrange avec Zend_Acl

Rebonjour,

Je suppose certainement qu'il faut que je fournisse quelques lignes de codes pour que vous ayez une vue d'ensemble alors soit smile

acl.ini

Code:

[role]
guest = null
member = null
customer = null
admin = null

[resource]
; default
default_auth = null
default_error = null
default_index = null
default_user = null
default_test = null
; gp
gp_index = null
gp_error = null
gp_test = null
; backend
backend_error = null
backend_index = null
backend_user = null

[guest]
allow.default_auth = null
allow.default_error = null
allow.default_index = null
allow.default_user = null
deny.default_user = cancel,email,info,panel,pass,success,welcome

[member : guest]
allow.default_test = null
removeAllow.default_auth = login
removeDeny.default_auth = logout
removeDeny.default_user = cancel,email,info,panel,pass,success,welcome

[customer : member]
allow.gp_index = null
allow.gp_error = null
allow.gp_test = null

[admin : customer]
allow.backend_error = null
allow.backend_index = null

Core_Acl.php

Code:

<?php
/**
 * Classe de création des ACL via un fichier de configuration INI
 * */
class Core_Acl extends Zend_Acl
{
    private $_aFilter = array();
    private $_aExclude = array();

    public function __construct()
    {
        $sFile = APPLICATION_PATH.'/configs/acl.ini';
        $oRole = new Zend_Config_Ini($sFile, 'role');
        $this->_setRole($oRole);

        $oResource = new Zend_Config_Ini($sFile, 'resource');
        $this->_setResource($oResource);

        foreach($oRole->toArray() as $sRole => $sParent) {
            $this->_setRight($sRole, new Zend_Config_Ini($sFile, $sRole));
        }
    }

    protected function _setRole($oRole)
    {
        foreach($oRole as $sRole => $sParent)
        {
            if(empty($sParent)) {
                $this->addRole(new Zend_Acl_Role($sRole));
            } else {
                $this->addRole(new Zend_Acl_Role($sRole), explode(',', $sParent));
            }
        }
        return $this;
    }

    protected function _setResource($oResource)
    {
        foreach($oResource as $sResource => $sParent)
        {
            if(empty($sParent)) {
                $this->add(new Zend_Acl_Resource($sResource));
            } else {
                $this->add(new Zend_Acl_Resource($sResource), explode(',', $sParent));
            }
            
        }
        return $this;
    }

    protected function _setRight($sRole, $oRight)
    {
        foreach($oRight as $mKey => $oResource)
        {
            foreach($oResource as $sResource => $sAction)
            {
                if(empty($sAction)) {
                    $this->{$mKey}($sRole, $sResource);
                } else {
                    $this->{$mKey}($sRole, $sResource, explode(',', $sAction));
                }
            }
        }
        return $this;
    }

}

Core_Plugin_Auth.php

Code:

<?php
class Core_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
    /**
     * @var Zend_Auth instance
     */
    private $_oAuth;

    /**
     * @var Zend_Acl instance
     */
    private $_oAcl;

    /**
     * Chemin de redirection lors de l'échec d'authentification
     */
    const FAIL_AUTH_MODULE     = 'default';
    const FAIL_AUTH_CONTROLLER = 'user';
    const FAIL_AUTH_ACTION     = 'deny';

    /**
     * Chemin de redirection lors de l'échec de contrôle de droits
     */
    const FAIL_ACL_MODULE     = 'default';
    const FAIL_ACL_CONTROLLER = 'user';
    const FAIL_ACL_ACTION     = 'right';

    /**
     * Constructeur
     */
    public function __construct(Zend_Acl $oAcl)
    {
        $this->_oAcl  = $oAcl;
        $this->_oAuth = Zend_Auth::getInstance();
    }

    /**
     * Vérifie les autorisations
     */
    public function preDispatch(Zend_Controller_Request_Abstract $oRequest)
    {
        if($this->_oAuth->hasIdentity()) {
            $sRole = $this->_oAuth->getIdentity()->sRole;
        } else {
            $sRole = 'guest';
        }
        $sResource = $oRequest->getModuleName().'_'.$oRequest->getControllerName();
        if(!$this->_oAcl->has($sResource)) {
            $sResource = null;
        }

        if(!$this->_oAcl->isAllowed($sRole, $sResource, $oRequest->getActionName())) {
            if(!$this->_oAuth->hasIdentity()) {
                $oRequest->setModuleName(self::FAIL_AUTH_MODULE);
                $oRequest->setControllerName(self::FAIL_AUTH_CONTROLLER);
                $oRequest->setActionName(self::FAIL_AUTH_ACTION);
            } else {
                $oRequest->setModuleName(self::FAIL_ACL_MODULE);
                $oRequest->setControllerName(self::FAIL_ACL_CONTROLLER);
                $oRequest->setActionName(self::FAIL_ACL_ACTION);
            }
        }
    }

}

Pour récapituler :
Lorsque j'accède au controller test du module gp, aucun problème.
Lorsque je valide un formulaire, acl me refuse l'accès pour erreur de privilège.

Je ne vois vraiment pas d'où peut provenir ce résultat étant donné que j'ai bien accès au controller et comme vous pouvez le voir également acl.ini ne montre aucun blocage unitaire sur ce controller.

Quelque chose doit certainement m'échapper mais je ne vois guère sad

En éspèrant trouver une âme charitable pour me secourir dans ma profonde détresse (joke inside)

Hors ligne

 

#3 16-08-2010 16:03:11

z3d
Nouveau membre
Date d'inscription: 15-08-2010
Messages: 3

Re: [Résolu] Problème étrange avec Zend_Acl

Juste pour prévenir que c'était résolu. Je ferais mieux de mettre des lunettes pour les mots de 2 lettres, c'est tellement petit que ca adore vous jouer de sale tour ^^'

Pour information, c'était une erreur de syntaxe de la redirection dans l'action du controller.

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