Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Acl & Zend_Auth
Zend_Acl & Zend_Auth Forum d'entraide pour les composants Zend_Acl & Zend_Auth du Zend Framework (contrôle d'accès, gestion des droits, authentification, etc.). Avant de poster -> Cours Zend_Acl et Zend_Auth.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2008, 12h47   #1
Invité régulier
 
Inscription : mars 2006
Messages : 26
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 26
Points : 8
Points : 8
Par défaut ACL et modules

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 :
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 :
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 :
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
vega_55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2008, 16h25   #2
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Bonjour,

J'ai l'impression que tu as déjà fait la moitié du chemin tout seul...

Tu as déjà défini des ressources sous la forme 'module/controlleur', par exemple :
Code :
$this->add(new Zend_Acl_Resource('frontend/index'),$frontend);
Je pense qu'il 'suffit' de systématiser cette solution, et d'interroger tes acl avec des ressources qui correspondent à ce schéma... Donc, faire :
Code :
1
2
3
4
5
6
$controller = $request->controller;
$action = $request->action;
$module = $request->module;
$resource = $module.'/'.$controller;
 
if (!$this->_acl->isAllowed($role, $resource, $action)) {
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2008, 19h23   #3
Invité régulier
 
Inscription : mars 2006
Messages : 26
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 26
Points : 8
Points : 8
Un grand merci, ca fonctionne ^^
vega_55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h25.


 
 
 
 
Partenaires

Hébergement Web