Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour
J'essaye de mettre en place zend_acl et la gestion de droit mais je rencontre plusieurs problémes a comprendre comment ça fonctionne
j'ai trouvé 2 tutorial Zend_Acl / Zend_Auth scénario d'exemple dans developpez.com et ce tutorial http://www.wowww.ch/index.php?post/2008 … -Zend-Acl.
le problème c'est que je sais pas ou mettre les classe My_Acl_Ini, My_Controller_Plugin_Auth
j'aimerai bien avoir quelque explication sur les étapes que je doit suivre et dans quel fichier je doit mettre les codes, ou si quelqu’un à un lien pour un autre tutorial .
Merci d'avance
Hors ligne
Il y a un webinar à ce sujet sur le site de ZF il me semble. Sinon pouf les classes de ce type il faut logiquement (après rien d'obligatoire), créer un dossier 'My' dans library (puis My/Acl et My/Controller)
Hors ligne
Merci shadypierre pour ta réponse et voila ce que j'ai fait d'apres ce tutorial :
http://www.wowww.ch/index.php?post/2008 … t-Zend-Acl
j'ai défini mes roles et mes ressource dans un fichier .ini que je l'ai mis dans mon dossier configs,
acl.ini
[roles] guest = null member = null admin = null [ressources] ; définition des ressources dans le module par défaut index = null affectation = null mouvements = null configurations = null reporting = null admin = null [guest] allow.index = null allow.reporting = null ; member hérite de guest [member : guest] ; on interdit le login (le membre est déjà identifié) deny.login = null allow.affectation = null allow.configurations = null allow.mouvements = null ; admin hérite de member [admin : member] allow.admin = null
apres j'ai ajouter un repertoire dans library My ou j'ai crée 2 classes
My_Controller_Plugin_Auth.php
<?php /** * Plugin d'authentification * * Largement inspiré de : * http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/auth-http/?page=modele-MVC **/ class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract { /** * @var Zend_Auth instance */ private $_auth; /** * @var Zend_Acl instance */ private $_acl; /** * Chemin de redirection lors de l'échec d'authentification */ const FAIL_AUTH_MODULE = 'default'; const FAIL_AUTH_ACTION = 'index'; const FAIL_AUTH_CONTROLLER = 'account'; /** * Chemin de redirection lors de l'échec de contrôle des privilèges */ const FAIL_ACL_MODULE = 'default'; const FAIL_ACL_ACTION = 'privileges'; const FAIL_ACL_CONTROLLER = 'error'; /** * Constructeur */ public function __construct(Zend_Acl $acl) { $this->_acl = $acl ; $this->_auth = Zend_Auth::getInstance() ; } /** * Vérifie les autorisations * Utilise _request et _response hérités et injectés par le FC */ public function preDispatch(Zend_Controller_Request_Abstract $request) { // is the user authenticated if ($this->_auth->hasIdentity()) { // yes ! we get his role $user = $this->_auth->getStorage()->read() ; $role = $user['role'] ; } else { // no = guest user $role = 'guest'; } $module = $request->getModuleName() ; $controller = $request->getControllerName() ; $action = $request->getActionName() ; $front = Zend_Controller_Front::getInstance() ; $default = $front->getDefaultModule() ; // compose le nom de la ressource if ($module == $default) { $resource = $controller ; } else { $resource = $module.'_'.$controller ; } // est-ce que la ressource existe ? if (!$this->_acl->has($resource)) { $resource = null; } // contrôle si l'utilisateur est autorisé if (!$this->_acl->isAllowed($role, $resource, $action)) { // l'utilisateur n'est pas autorisé à accéder à cette ressource // on va le rediriger if (!$this->_auth->hasIdentity()) { // il n'est pas identifié -> module de login $module = self::FAIL_AUTH_MODULE ; $controller = self::FAIL_AUTH_CONTROLLER ; $action = self::FAIL_AUTH_ACTION ; } else { // il est identifié -> error de privilèges $module = self::FAIL_ACL_MODULE ; $controller = self::FAIL_ACL_CONTROLLER ; $action = self::FAIL_ACL_ACTION ; } } $request->setModuleName($module) ; $request->setControllerName($controller) ; $request->setActionName($action) ; } }
\\ My_Acl_Ini.php
<?php /** * Classe de création des ACL via un fichier de configuration INI **/ class My_Acl_Ini extends Zend_Acl { public function __construct($file) { $roles = new Zend_Config_Ini($file, 'roles') ; $this->_setRoles($roles) ; $ressources = new Zend_Config_Ini($file, 'ressources') ; $this->_setRessources($ressources) ; foreach ($roles->toArray() as $role => $parents) { $privileges = new Zend_Config_Ini($file, $role) ; $this->_setPrivileges($role, $privileges) ; } } protected function _setRoles($roles) { foreach ($roles as $role => $parents) { if (empty($parents)) { $parents = null ; } else { $parents = explode(',', $parents) ; } $this->addRole(new Zend_Acl_Role($role), $parents); } return $this ; } protected function _setRessources($ressources) { foreach ($ressources as $ressource => $parents) { if (empty($parents)) { $parents = null ; } else { $parents = explode(',', $parents) ; } $this->add(new Zend_Acl_Resource($ressource), $parents); } return $this ; } protected function _setPrivileges($role, $privileges) { foreach ($privileges as $do => $ressources) { foreach ($ressources as $ressource => $actions) { if (empty($actions)) { $actions = null ; } else { $actions = explode(',', $actions) ; } $this->{$do}($role, $ressource, $actions); } } return $this ; } }
et voila ce que j'ai ajouter a mon fichier Boostrap.php :
$acl_ini = '../config/acl.ini' ;
$acl = new My_Acl_Ini($acl_ini) ;
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAutoload() { $moduleLoader = new Zend_Application_Module_Autoloader(array( 'namespace' => '', 'basePath' => APPLICATION_PATH)); return $moduleLoader; $acl_ini = '../config/acl.ini' ; $acl = new My_Acl_Ini($acl_ini) ; $front->registerPlugin(new My_Controller_Plugin_Auth($acl)) ; } protected function _initViewHelpers() { $this->bootstrap('layout'); $layout = $this->getResource('layout'); $view = $layout->getView(); $view->doctype('XHTML1_STRICT'); $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); $view->headTitle()->setSeparator(' - '); $view->headTitle('Application CDG Gestion de Stock'); } .......
Apres qu'est ce que je doit ajouter dans ma fonction login ????????
Hors ligne
Dans un 1er temps quand tu dis
apres j'ai ajouter un repertoire dans library My ou j'ai crée 2 classes
as tu bien ceci :
- Library/My/Acl/Ini.php ?
- Library/My/Controller/Plugin/Auth.php ?
Ensuite, dans ton bootstrap tu sors ceci du (cf : ci dessous) _initLoader()
[lang=php]$acl_ini = '../config/acl.ini' ; $acl = new My_Acl_Ini($acl_ini) ; $front->registerPlugin(new My_Controller_Plugin_Auth($acl)) ;
Tu ajoute ceci a la place :
[lang=php] Zend_Loader_Autoloader::getInstance()->registerNamespace('MY') ->getRegisteredNamespaces();
Et enfin tu ajoute une fonction dans ton bootstrap pour les ACL
[lang=php] protected function _initAcl() { // plugin Acl/Auth $acl_ini = APPLICATION_PATH . '/configs/acl.ini' ; $acl = new MY_Acl_Ini($acl_ini); Zend_Controller_Front::getInstance()->registerPlugin(new MY_Controller_Plugins_Auth($acl)); Zend_Registry::set('Zend_Acl', $acl); }
Dernière modification par shadypierre (22-06-2011 14:23:17)
Hors ligne
Bonjour,
Juste un ajout : l'autoload par défaut prends en charge le chargement des classes de plugin contenues dans le répertoire /application/plugins
Hors ligne
J'ai reproduit l'exemple proposé dans le forum. Je n'obtiens aucun résultat et aucun affichage.
Merci par avance de m'indiquer les erreurs dans les scripts ci-dessous.
Ci dessous la structure de l'application (répertoires et scripts) :
test_acl application controllers layouts models views acl.ini bootstrap.php config.ini library My Acl Ini.php Controller Plugin Auth.php Zend public css js images index.php .htaccess
Ci dessous le contenu des différents scripts :
-------------------------------------------------------------------
index.php
[lang=php] <?php error_reporting(E_ALL|E_STRICT); ini_set('display_errors', 1); date_default_timezone_set('Europe/London'); // directory setup and class loading set_include_path('.' . PATH_SEPARATOR . '../library/' // . PATH_SEPARATOR . '../application/models' . PATH_SEPARATOR . get_include_path()); $appPath = dirname(__FILE__); $rootPath = dirname($appPath); set_include_path(get_include_path() . PATH_SEPARATOR . $rootPath . '/application/models/' . PATH_SEPARATOR ); // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); // Define application environment defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'general')); // Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array( realpath(APPLICATION_PATH . '/../library'), get_include_path(), ))); /** Zend_Application */ require_once 'Zend/Application.php'; // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/config.ini' ); $application->bootstrap() ->run();
-------------------------------------------------------------------
Bootstrap.php
[lang=php] <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initAutoload() { $moduleLoader = new Zend_Application_Module_Autoloader(array( 'namespace' => '', 'basePath' => APPLICATION_PATH)); return $moduleLoader; Zend_Loader_Autoloader::getInstance()->registerNamespace('MY') } protected function _initAcl() { // plugin Acl/Auth $acl_ini = APPLICATION_PATH . 'acl.ini' ; $acl = new MY_Acl_Ini($acl_ini); Zend_Controller_Front::getInstance()->registerPlugin(new MY_Controller_Plugins_Auth($acl)); Zend_Registry::set('Zend_Acl', $acl); } protected function _initViewHelpers() { $this->bootstrap('layout'); $layout = $this->getResource('layout'); $view = $layout->getView(); $view->doctype('XHTML1_STRICT'); $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); $view->headTitle()->setSeparator(' - '); $view->headTitle('Application CDG Gestion de Stock'); } }
-------------------------------------------------------------------
Auth.php
[lang=php] <?php /** * Plugin d'authentification * * Largement inspiré de : * http://julien-pauli.developpez.com/tutoriels/zend-framework/atelier/auth-http/?page=modele-MVC **/ class My_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract { /** * @var Zend_Auth instance */ private $_auth; /** * @var Zend_Acl instance */ private $_acl; /** * Chemin de redirection lors de l'échec d'authentification */ const FAIL_AUTH_MODULE = 'default'; const FAIL_AUTH_ACTION = 'index'; const FAIL_AUTH_CONTROLLER = 'account'; /** * Chemin de redirection lors de l'échec de contrôle des privilèges */ const FAIL_ACL_MODULE = 'default'; const FAIL_ACL_ACTION = 'privileges'; const FAIL_ACL_CONTROLLER = 'error'; /** * Constructeur */ public function __construct(Zend_Acl $acl) { $this->_acl = $acl ; $this->_auth = Zend_Auth::getInstance() ; } /** * Vérifie les autorisations * Utilise _request et _response hérités et injectés par le FC */ public function preDispatch(Zend_Controller_Request_Abstract $request) { // is the user authenticated if ($this->_auth->hasIdentity()) { // yes ! we get his role $user = $this->_auth->getStorage()->read() ; $role = $user['role'] ; } else { // no = guest user $role = 'guest'; } $module = $request->getModuleName() ; $controller = $request->getControllerName() ; $action = $request->getActionName() ; $front = Zend_Controller_Front::getInstance() ; $default = $front->getDefaultModule() ; // compose le nom de la ressource if ($module == $default) { $resource = $controller ; } else { $resource = $module.'_'.$controller ; } // est-ce que la ressource existe ? if (!$this->_acl->has($resource)) { $resource = null; } // contrôle si l'utilisateur est autorisé if (!$this->_acl->isAllowed($role, $resource, $action)) { // l'utilisateur n'est pas autorisé à accéder à cette ressource // on va le rediriger if (!$this->_auth->hasIdentity()) { // il n'est pas identifié -> module de login $module = self::FAIL_AUTH_MODULE ; $controller = self::FAIL_AUTH_CONTROLLER ; $action = self::FAIL_AUTH_ACTION ; } else { // il est identifié -> error de privilèges $module = self::FAIL_ACL_MODULE ; $controller = self::FAIL_ACL_CONTROLLER ; $action = self::FAIL_ACL_ACTION ; } } $request->setModuleName($module) ; $request->setControllerName($controller) ; $request->setActionName($action) ; } }
-------------------------------------------------------------------
Ini.php
[lang=php] <?php /** * Classe de création des ACL via un fichier de configuration INI **/ class My_Acl_Ini extends Zend_Acl { public function __construct($file) { $roles = new Zend_Config_Ini($file, 'roles') ; $this->_setRoles($roles) ; $ressources = new Zend_Config_Ini($file, 'ressources') ; $this->_setRessources($ressources) ; foreach ($roles->toArray() as $role => $parents) { $privileges = new Zend_Config_Ini($file, $role) ; $this->_setPrivileges($role, $privileges) ; } } protected function _setRoles($roles) { foreach ($roles as $role => $parents) { if (empty($parents)) { $parents = null ; } else { $parents = explode(',', $parents) ; } $this->addRole(new Zend_Acl_Role($role), $parents); } return $this ; } protected function _setRessources($ressources) { foreach ($ressources as $ressource => $parents) { if (empty($parents)) { $parents = null ; } else { $parents = explode(',', $parents) ; } $this->add(new Zend_Acl_Resource($ressource), $parents); } return $this ; } protected function _setPrivileges($role, $privileges) { foreach ($privileges as $do => $ressources) { foreach ($ressources as $ressource => $actions) { if (empty($actions)) { $actions = null ; } else { $actions = explode(',', $actions) ; } $this->{$do}($role, $ressource, $actions); } } return $this ; } }
Dernière modification par magnan (30-06-2011 11:44:00)
Hors ligne
Pourrais-tu éditer ton message afin d'utiliser les balises de code :
[ code][lang=php]code ici[/ code]
Merci d'avance
Dernière modification par shadypierre (30-06-2011 10:58:56)
Hors ligne
Bonjour,
Quelqu'un aurait-il plus simplement un petit Zip, avec un exemple qui contient un implémentation
de Zend_Auth et Zend_Acl.
Car tout ce que je trouve, soit ne marche pas ou n'est pas complet.
Merci d'avance.
Cordialement
Hors ligne
Pages: 1