Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Pour les ACL, j'avais retenu la chose comme ceci :
* - un role : guest, user, admin, ...
* - une ressource : controller
* - un privilège : action
Mais quand on a une structure modulaire, je suppose qu'il faut bien prendre en compte le module quelque part, mais comment ?
Merci
Dernière modification par Mr.MoOx (03-07-2008 13:51:25)
Hors ligne
Dites moi si c'est la bonne (une des façons ?) de faire :
Dans mon plugin :
$privilege = $request->getControllerName() . "_" . $request->getActionName(); $resource = $request->getModuleName();
Et dans mes ACL, je mets donc le module en tant que ressource et dans les privilèges, je met le combo controller_action.
Hors ligne
Moi j'ai plutot module_controller puis action
//recup de la ressource en cours $controller = $request->getControllerName(); $action = $request->getActionName(); $module = $request->getModuleName(); if ($module!='default') { $resource = $module.'_'.$controller; } else { $resource = $controller; } //test de la ressources if (!$this->_acl->has($resource)) { $resource = null; } //test de l'acces if (!$this->_acl->isAllowed($role, $resource, $action)) { //...
Hors ligne
Moi je procède plutôt comme suit:
... $acl->add(new Zend_Acl_Resource('user_index')); $acl->add(new Zend_Acl_Resource('admin_index')); $acl->allow('guest', 'user_index'); $acl->allow('admin', 'admin_index'); $acl->allow('admin'); return $acl; ...
Mais il ne reconnait pas le séparateur "_" pour faire la différence entre un module et un controller
Il va me sortir cette erreur lorsque je s'esseye d'accéder au IndexControlelr de l'admin ou du user:
Message: Resource 'index' not found Request Parameters: array(3) { ["module"]=> string(5) "admin" ["controller"]=> string(5) "index" ["action"]=> string(5) "index" }
J'utilise l'aborescence modulaire proposé par Zend : http://framework.zend.com/manual/en/zen … dular.html
Dernière modification par probitaille (10-07-2009 16:51:09)
Hors ligne
C'est a toi de concatener le nom du module et du controller avant ton test sur la resource
Hors ligne
Mes controllers sont déjà nommer comme ceci:
class Admin_IndexController extends Zend_Controller_Action
Mais toi tu me dis que je dois concatener le nom du module avant ?
C'est à dire, déclarer une variable en faisant une sorte de :
$privilege = $request->getControllerName() . "_" . $request->getActionName() comme plus haut ??
Merci !
Dernière modification par probitaille (10-07-2009 17:14:37)
Hors ligne
$acl->add(new Zend_Acl_Resource('user')); $acl->add(new Zend_Acl_Resource('admin')); $acl->add(new Zend_Acl_Resource('index'), 'user'); $acl->add(new Zend_Acl_Resource('index'), 'admin'); ------> Error : id 'index' already declared.
Et ceci:
$acl->add(new Zend_Acl_Resource('user')); $acl->add(new Zend_Acl_Resource('admin')); $acl->add(new Zend_Acl_Resource('user_index'), 'user'); ----> Error : Resource 'index' not found. $acl->add(new Zend_Acl_Resource('admin_index'), 'admin');
Dernière modification par probitaille (10-07-2009 20:45:24)
Hors ligne
Salut probitaille,
Je ne sais pas si tu as trouver une solution a ton problème :
$acl->add(new Zend_Acl_Resource('index'), 'admin'); ------> Error : id 'index' already declared. $acl->add(new Zend_Acl_Resource('user_index'), 'user'); ----> Error : Resource 'index' not found.
Mais moi j'ai eu le même bug que toi et je l'ai résolu comme ça :
Au lieu de faire :
$acl->add(new Zend_Acl_Resource('admin')); $acl->add(new Zend_Acl_Resource('index'), 'user'); $acl->add(new Zend_Acl_Resource('index'), 'admin'); ------> Error : id 'index' already declared.
J'ai fait :
$acl->add(new Zend_Acl_Resource('Users'));------>défini ma ressource(controller) Ensuite : je bloque l'accès à tout le monde //Deny $this->deny('guest', 'Users'); Enfin : j'autorise l'accès aux rôles que je veux $this->allow('client', 'Users', array('index','update')); $this->allow('clientPlus', 'Users', array('delete','register'));
Voila comment j'ai fait pour palier au bug/problème/erreur.
Si tu as une meilleurs solution je suis preneur
Bon Code....!
Hors ligne
Merci de ta réponse, en fait moi le code fonctionne maintenant de cette façon:
$acl->addRole(new Zend_Acl_Role('guest')); $acl->addRole(new Zend_Acl_Role('admin')); $acl->add(new Zend_Acl_Resource('admin')); $acl->add(new Zend_Acl_Resource('admin_index'),'admin'); $acl->add(new Zend_Acl_Resource('admin_who'),'admin'); $acl->add(new Zend_Acl_Resource('admin_where'),'admin');
Par contre, pour qui détected bien le admin_ comme un module, il faut bien structurer sont projet
applications
-admin
--controllers
--views
-user
--controllers
--views
Et s'assurer d'avoir un truc semblable dans le bootstrap
protected function _initFrontcontroller() { // Récupération d'une instance du controleur frontal (singleton) $frontController = Zend_Controller_Front::getInstance(); //$frontController->addModuleDirectory(APPLICATION_PATH); // Définition du répertoire de modules $frontController->setControllerDirectory(array( 'default' => APPLICATION_PATH .'/user/controllers/', 'adminGalleries' => APPLICATION_PATH .'/adminGalleries/controllers/', 'admin' => APPLICATION_PATH .'/admin/controllers/' )); // $frontController->addControllerDirectory(APPLICATION_PATH . '/admin/controllers','admin'); $frontController->registerPlugin(new Default_Model_AccessPlugin(), 1); //echo APPLICATION_PATH.'---'; return $frontController; }
Cela fait déjà un bon moment, peut-être qu'il y avait autre chose à régler mais je ne crois pas, je me souviens pas très bien. J'espère que cela peut aider.
Dernière modification par probitaille (19-08-2009 15:37:38)
Hors ligne