ACL : comportement étrange
Bonjour à tous,
Je débute avec ZF et je rencontre pas mal de difficultés sur l'installation d'un système Auth/ACL.
J'ai suivi ce tuto, mais ce post, et celui-là m'ont fait avancer plus vite.
Mon problème
Le système ACL n'en fait qu'à sa tête ! Avec le code ci-dessous, lorsque je ne suis pas identifié (rôle "unknown"), j'ai accès à toutes les actions de tous controleurs, sans restriction.
On pourrait penser que mon ACL n'est pas "branché", mais lorsque je place un "$this->deny('unknown');", tout est bloqué comme il faut.
En résumé, soit j'ai accès à tout, soit à rien. Pas de juste milieu, ennuyeux...
Merci pour votre aide !
La Classe :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class My_Class_Acl extends Zend_Acl
{
public function __construct(Zend_Auth $auth)
{
// Définition des Controllers concernés par l'authentification.
$this->add(new Zend_Acl_Resource('Auth'));
$this->add(new Zend_Acl_Resource('Index'));
$this->add(new Zend_Acl_Resource('Contributions'));
$this->add(new Zend_Acl_Resource('Events'));
$this->add(new Zend_Acl_Resource('People'));
// Définition des rôles.
$this->addRole(new Zend_Acl_Role('unknown'));
$this->addRole(new Zend_Acl_Role('guest'));
$this->addRole(new Zend_Acl_Role('member'), 'guest');
$this->addRole(new Zend_Acl_Role('admin'), 'member');
// Définition des droits.
$this->allow('unknown');
$this->deny('unknown', 'Contributions');
$this->deny('unknown', 'Events');
$this->deny('unknown', 'People');
$this->allow('guest');
$this->deny('guest', 'Contributions');
$this->deny('guest', 'Events');
$this->deny('guest', 'People');
$this->allow('member');
$this->deny('member', 'Contributions');
$this->deny('member', 'Index', 'add');
$this->deny('member', 'Index', 'edit');
$this->deny('member', 'Index', 'delete');
$this->allow('admin');
}
} |
Le fameux plugin Janitrix ;)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| <?php
/**
* Ce fichier contient la classe Inuitech_Acl_Plugin.
*
* @copyright 2008 Gabriel Malkas
* @license "New" BSD License
*/
/**
* Plugin qui vérifie les droits d'accès de la session en cours
* à la page demandée.
*
* @copyright 2008 Gabriel Malkas
* @license "New" BSD License
*/
class My_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
private $_auth = null;
private $_acl = null;
public function __construct($auth, $acl)
{
$this->_auth = $auth;
$this->_acl = $acl;
}
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$role = 'unknown';
if ($this->_auth->hasIdentity()) {
$role = $this->_auth->getIdentity()->role;
}
$_SESSION['toto'] = $role;
$controller = $request->controller;
$action = $request->action;
$module = $request->module;
$resource = $this->_acl->has($controller) ? $controller : null;
if (!$this->_acl->isAllowed($role, $resource, $action)) {
$request->setControllerName('Error');
$request->setActionName('deny');
}
}
} |
Puis le morceau de bootstrap :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| // Création de l'objet Auth
$auth = Zend_Auth::getInstance();
// Création de l'objet Acl
$acl = new My_Class_Acl($auth);
// Mise en place du controleur.
$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);
$frontController->setControllerDirectory('./application/controllers');
$frontController->registerPlugin(new My_Plugin_Acl($auth, $acl));
Zend_Layout::startMvc(array('layoutPath'=>'./application/layouts')); |