Bonjour,

Je suis en train de développer un petit CMS avec Zend Framework

Voici la structure de mon application:

application/

backend/

controllers/
views/
default/

controllers/
views/
frontend/

controllers/
views/
models/
config.ini
doc/
library/
public/
index.php
MyAcl.php
Auth.php

Il y a donc des controlleurs de même nom (indexController), mais dans des modules différents.

Mon probleme est le suivant : Comment définir les ACL en fonction de mes modules/controlleur/action plutot qu'avec controlleur/action ?

Par exemple : la méthode indexAction de indexController est accessible a tout utilisateur dans le module "frontend" et "default", et est seulement accessible a admin dans le module "backend".

Voici mes fichier d'ACL :

bootstrap (index.php)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
// Création de l'objet Acl
	$acl = new MyAcl($auth);
 
	// setup controller
	$frontController = Zend_Controller_Front::getInstance();
	$frontController->throwExceptions(true);
	$frontController->setControllerDirectory('./application/controllers');
	$frontController->registerPlugin(new Auth($auth, $acl));
	$frontController->setControllerDirectory(array(
	      'default' 	=> './application/default/controllers',
	      'frontend' 	=> './application/frontend/controllers',
	      'backend'    	=> './application/backend/controllers'
	));
MyAcl.php
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
 
<?php
 
class MyAcl extends Zend_Acl
{
    public function __construct(Zend_Auth $auth)
    {
        $roleGuest = new Zend_Acl_Role('guest');
 
		$default = new Zend_Acl_Resource('default');
        $this->add($default);
		$this->add(new Zend_Acl_Resource('index'),$default);
 
        $frontend = new Zend_Acl_Resource('frontend');
        $this->add($frontend);
		$this->add(new Zend_Acl_Resource('frontend/index'),$frontend);
 
        $backend = new Zend_Acl_Resource('backend');
        $this->add($backend);
		$this->add(new Zend_Acl_Resource('backend/index'),$backend);
 
        $this->addRole(new Zend_Acl_Role('guest'));
        $this->addRole(new Zend_Acl_Role('author'), 'guest');
        $this->addRole(new Zend_Acl_Role('admin'), 'author');
        $this->addRole(new Zend_Acl_Role('root'), 'admin');
 
        // Droits d'acces
        $this->allow('guest');
    }
 
}
 
?>
Auth.php
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
53
54
55
56
57
58
59
60
61
62
63
 
<?php
 
class Auth extends Zend_Controller_Plugin_Abstract
{
    private $_auth;
    private $_acl;
 
    private $_noauth = array('module' => 'default',
                             'controller' => 'index',
                             'action' => 'noauth');
 
    private $_noacl = array('module' => 'default',
                            'controller' => 'index',
                            'action' => 'noacl');
 
    public function __construct($auth, $acl)
    {
        $this->_auth = $auth;
        $this->_acl = $acl;
    }
 
	public function preDispatch(Zend_Controller_Request_Abstract $request)
	{
        if ($this->_auth->hasIdentity()) {
            $temp = $this->_auth->getIdentity()->niveau_user;
            $role = "guest";
            if($temp == 1) $role = "guest";
            if($temp == 2) $role = "author";
            if($temp == 3) $role = "admin";
            if($temp == 4) $role = "root";
        } else {
            $role = 'guest';
        }
 
    	$controller = $request->controller;
    	$action = $request->action;
    	$module = $request->module;
		$resource = $controller;
 
    	if (!$this->_acl->has($resource)) {
        	$resource = null;
    	}
 
        if (!$this->_acl->isAllowed($role, $resource, $action)) {
            if (!$this->_auth->hasIdentity()) {
                $module = $this->_noauth['module'];
                $controller = $this->_noauth['controller'];
                $action = $this->_noauth['action'];
            } else {
				$module = $this->_noacl['module'];
                $controller = $this->_noacl['controller'];
                $action = $this->_noacl['action'];
			}
        }
 
		$request->setModuleName($module);
		$request->setControllerName($controller);
		$request->setActionName($action);
	}
}
 
?>
Merci d'avance pour votre aide