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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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'));