Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je suis de nouveau confronté à un problème su mon projet. Je viens d’implémenter les droits d’accès sans problème, si ce n’est que si une page est introuvable (mauvais contrôleur ou mauvaise action), je suis redirigé vers ma page de login, et non vers ma page 404.
Ayant parcouru diverses discussions à ce sujet, j’ai bien vérifié que la remontée des exceptions était désactivée [$frontController->throwExceptions(false);].
Bien que le plugin ErrorHandler soit chargé par défaut, je l’ai tout de même enregistré avant mon plugin Acl, mais rien n’y fait.
J’ai également vérifié que tout le monde ai accès à mon contrôleur d’action, mais le problème ne vient pas de là !
Dans mon plugin Acl, quand la ressource n’est pas dans les Acl je lui attribut la valeur null. La seule solution que j’ai alors trouvé est d’autoriser tout le monde à accéder à la ressource null, mais ce n’est pas une technique idéale !
Est-ce que j’aurais loupé une étape quelque part ? Merci d’avance si vous avez une solution à me proposer et bonne soirée !
Florent
Hors ligne
Dans mon plugin ACL, je teste si la page demandée existe ou non avant de tester les droits.
Si elle n'existe pas, je renvoie sur la 404 (en changeant l'action, le contrôleur et le module).
A+, Philippe
Hors ligne
Bonsoir Philippe,
J'ai parcouru d'autres discussions sur le forum et sur d'autres sites à ce sujet et je suis tombé sur ce sujet qui vérifie si la requête peut aboutir ou non (isDispatchable), mais je me demandais si cette solution n'était pas trop lourde en terme de performance ? Qu'en penses-tu ?
J'ai également trouvé une autre solution à mon problème. Dans mon cas je testais juste si l'accès était autorisé et j'effectuais une redirection le cas échéant.
if (!$this->_acl->isAllowed($role, $ressource, $action)) { if (!$this->_auth->hasIdentity()) { $request->setModuleName('default'); $request->setControllerName('auth'); $request->setActionName('index'); } else { $request->setModuleName('default'); $request->setControllerName('error'); $request->setActionName('privileges'); } }
Après ma condition d'Acl j'ai ajouté le code suivant :
$request->setModuleName($module); $request->setControllerName($controller); $request->setActionName($action);
Du coup, si ma ressource vaut null, je continue le traitement et la requête suit son cours normal jusqu'à lever une exception pour contrôleur introuvable.
Penses-tu qu'il est préférable d'implémenter la gestion complète avec la méthode isDispatchable, ... ?
D'avance un grand merci,
Bonne soirée.
Florent
Hors ligne
Bonjour,
Je trouve ça intéressant ce isDispatchable. A mon avis ça vaut le coup de creuser, mais je te dis ça très abstraitement, je n'avais pas pensé à faire comme ça...
Pour les perfs il faudrait tester, mais il est possible que ça soit assez transparent. Peut-être que le dispatch n'est pas réellement lancé une 2e fois... A regarder dans le code ou à tester en charge. Désolé, je n'ai pas le temps de creuser tout de suite.
A+, Philippe
Hors ligne
isDispatchable test si il est possible de chargé la class du controller, il ne test pas la fonction "action"
(voir le code dans Zend/Controller/Dispatcher/Standard.php)
Hors ligne
Pages: 1