Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Mon site nécessite cinq rôles : 'invité', 'lecteur', 'rédacteur', 'modérateur' et 'admin'
l'invité et le lecteur ne peuvent que lire les articles
le rédacteur peut ajouter un article et modifier ses propres articles seulement.
le modérateur valide ou non les articles ajoutés par le rédacteur et peut modifier n'importe quel article.
l'admin... peut tout faire
Pour éditer un article j'ai une action modifierAction() dans ArticlesController.
Jusque là rien de bien nouveau.
Quand 'modérateur' veut modifier un article, pas de problème il a les droits :
$acl->allow('modérateur', 'articles', array('ajouter', 'valider', 'modifier', 'supprimer'));
Si j'ajoute l'action 'modifier' pour le 'rédacteur', il aura les droits pour modifier tous les articles alors il ne peut modifier que les siens.
j'ai tenté de créer une autre action correspondante à la modification de ses créations mais je n'ai pas envi d'écrire une seconde fois modifierAction()
J'aimerais donc savoir quel serait la meilleur approche à avoir dans ce contexte.
Merci d'avance,
Devether
Dernière modification par Devether (29-01-2010 09:36:39)
Hors ligne
Je n'ai pas le temps de répondre plus en profondeur, mais c'est le 4ème paramètre qu'il faut compléter. Tu dois créer ta propre "assertion" et la passer en paramètre de ton allow().
Hors ligne
Merci c'est ce qu'il me fallait.
Cependant, je ne sais pas comment récupérer la request dans assert() pour avoir l'id de l'article qui est en paramètre et ainsi vérifier le créateur.
Dernière modification par Devether (28-01-2010 12:20:56)
Hors ligne
Quand tu construis ta classe Assertion, tu peux faire ton propre constructeur et lui passé ce que tu veux en paramètre, après, dans ta fonction assert, tu peux ainsi récupérer les valeurs
Hors ligne
Dans ton cas, je crois qu'il te faudra utilise $_GET dans ton assertion même si ce n'est pas super propre.
Hors ligne
3uclide a écrit:
Dans ton cas, je crois qu'il te faudra utilise $_GET dans ton assertion même si ce n'est pas super propre.
nan nan
Hors ligne
Étant donné que l'assertion sera créé avant le dispatching (j'imagine), donc tu n'as pas accès au paramètre de la requête... Que proposes-tu?
Hors ligne
Salut,
Attention, une action dans les ACLs n'est pas forcément égale à une action de controleur. C'est bien pratique parce qu'on peut faire un plugin ou un helper qui automatise tout ça, mais c'est souvent contraignant. La logique voudrait que l'article soit la ressource et l'user le role (et donc que ce soit la classe Article qui implémente Zend_Acl_Resource_Interface et non pas le controlleur).
A ce moment là dans l'assertion c'est très simple, il suffit de comparer l'userId de l'article à l'id de l'user connecté.
A+ benjamin.
Hors ligne
3uclide a écrit:
Étant donné que l'assertion sera créé avant le dispatching (j'imagine), donc tu n'as pas accès au paramètre de la requête... Que proposes-tu?
Biensur que si les paramètres sont dispo. A partir du moment ou la route est identifiée, les paramètres sont disponible dans l'objet request
EDIT : donc déjà accessible dans routeStartup($request)
Dernière modification par nORKy (28-01-2010 17:20:23)
Hors ligne
nORKy a écrit:
Biensur que si les paramètres sont dispo. A partir du moment ou la route est identifiée, les paramètres sont disponible dans l'objet request
En effet, ils le sont :
class My_Acl_Assert_EstCreateurArticle implements Zend_Acl_Assert_Interface { public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null) { return $this->_estCreateur(); } protected function _estCreateur() { // on récupère l'identité de l'utilisateur connecté $auth = Zend_Auth::getInstance(); $identity = $auth->getIdentity(); // on récupère le paramètre correspondant à l'id de l'article $request = Zend_Controller_Front::getInstance()->getRequest(); $articleId = $request->getParam('id', null); if (null === $articleId) return false; $tableArticles = new Articles(); $articles = $tableArticles->find($articleId); if (!$articles->valid()) return false; $article = $articles->current(); if ($article->utilisateur_id == $identity->id) return true; else return false; } }
Et ça marche parfaitement. Merci à tous.
Hors ligne
Pages: 1