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