Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'aurais besoin de quelques critiques sur la façon dont j'authentifie mes utilisateurs (si c'est correct ou pas et/ou si on peut mieux faire), et sur la "meilleure" façon de mettre en place les ACL. Je vois beaucoup de façons différentes pour mettre en place les ACL sur le net, mais la plupart commencent déjà à dater et elles sont vraiment différentes les unes des autres.
Donc pour l'authentification, j'ai un formulaire situé dans un ViewHelper (dans la sidebar de mon site). Lors de sa création je lui passe l'objet requête, la table user, l'adapter et un objet AuthenticationService grâce au service manager (je ne sais pas si c'est vraiment utile de mettre l'objet AuthenticationService dans le service manager vu que je ne l'utilise qu'une fois et que dans l'aide de vue).
Ensuite, je vérifie si l'utilisateur est connecté, si c'est le cas je n'affiche pas le formulaire de connexion.
Sinon je vérifie si le formulaire a été soumis. Si oui, je vérifie sa validité grâce à l'InputFilter. Si c'est valide, j'essaie d'authentifier l'utilisateur en passant un objet Zend\Authentication\Adapter\DbTable à l'objet AuthenticationService :
[lang=php] $this->authService->setAdapter($authAdapter); $result = $this->authService->authenticate();
Si c'est ok, je garde l'id de l'utilisateur :
[lang=php] $storage = $this->authService->getStorage(); if(!$storage->isEmpty()) $storage->clear(); $storage->write($authAdapter->getResultRowObject('id'));
Pour ce qui est des ACL, j'ai vu que des modules existaient (comme BjyAuthorize), mais que ZF2 disposait déjà de librairies pour les ACL. Quels sont les avantages de chaque méthode ?
J'aimerai que les droits d'accès ne soit vérifié que si la ressource demandée existe dans les ACL (qu'on puisse aussi avoir une redirection spécifique selon la page demandée), sinon on laisse le router renvoyer l'erreur (si la ressource n'existe pas, page 404).
Pourrais-je faire quelque chose comme ça avec les librairies de base de ZF2 ?
Si je veux qu'un formulaire ne s'affiche sur une page que si l'utilisateur est connecté, je dois utiliser les ACL ? Ou vérifier dans le controller s'il est connecté ? (une partie de la page en plus si connecté, sinon la page normal, soit une même ressource)
Merci de bien vouloir m'éclairer !
Dernière modification par Seryus (05-08-2013 22:01:21)
Hors ligne
Salut, je maitrise pas énormément les ACLs mais à priori tout ce que tu veux faire est possible via les librairies du ZF2. L'avantage d'un module comme ByjAuthorize par exemple est de fournir un environnement de travail prêt à fonctionner, il ne te reste plus qu'à le configurer donc c'est un gros gain de temps si tu maitrises pas trop cette partie.
Il y a aussi Rbac de Spiffy si je dis pas de bêtises qui est bien foutu par contre je sais pas s'il son module l'implémente déjà ou fourni juste les libs pour le faire.
Hors ligne
En effet j'ai réussi à faire ce que je voulais assez facilement en utilisant les librairies de ZF2. Mais du coup je ne comprends pas l'intérêt des modules externes. Je regarderai ça plus tard, pour l'instant j'ai eu de que je voulais, merci
PS: Faudrait peut-être ajouter un bouton résolu au forum non ?
Hors ligne
Seryus a écrit:
PS: Faudrait peut-être ajouter un bouton résolu au forum non ?
Il faudrait y ajouter plein de choses ^^. Un forum est en développement mais on a pas le temps en ce moment de bosser dessus :p.
Hors ligne
Ok bon courage à vous dans ce cas
Encore une petite question, j'ai vu que l'objet Http\Response avait une fonction isForbidden() qui retourne vrai ou faux si la route est autorisée par les ACL, comment utiliser cette fonction ?
Pour ma part, j'utilise ça pour le moment :
[lang=php] if ($this->acl->hasResource($resource) && !$this->acl->isAllowed($role, $resource, $action)) { $e->getResponse()->setStatusCode(403); }
Edit: Finalement cette méthode ne fait que comparer le statut de la réponse, mais je n'arrive pas à rediriger vers une page d'erreur 403 personnalisée. Changer seulement le statut n'y fait rien, par contre pour une erreur 404 ça fonctionne. Pourriez-vous m'indiquer la démarche à suivre ?
Dernière modification par Seryus (03-07-2013 11:34:10)
Hors ligne
Je viens de réaliser que mon système d'ACL ne sert à rien, le code
[lang=php] $e->getResponse()->setStatusCode(404);
ne fait que changer l'entête de la requête et me redirige sur la vue 404. L'action est quand même exécutée.
Comment faire pour empêcher que ça arrive et rediriger correctement vers la page d'erreur ?
Hors ligne
Rajoute un return ?
Hors ligne
Déjà essayé, ça n'a pas fonctionné. Je pense que je ne fais pas mes ACL au bon endroit. Voici ce que j'ai dans Module.php :
[lang=php] public function onBootstrap(MvcEvent $e) { $this->acl = new Acl(); // Une classe personnalisée qui étend Zend\etc\Acl $this->acl->setUp($this->getAclRules()); //Initialise les droits à partir d'un fichier de config $eventManager = $e->getApplication()->getEventManager(); $eventManager->attach('route', array($this, 'allowedRoute')); //Fonction qui vérifie si la route est autorisée $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); }
Edit : En faite j'avais mis le return après la ligne, avec
[lang=php] return $e->getResponse()->setStatusCode(403);
ça fonctionne, mais ça me renvoi une page blanche (sans layout ni message d'erreur).
Dernière modification par Seryus (06-08-2013 22:30:07)
Hors ligne
Comment rediriger vers une route à partir ma fonction allowedRoute qui se trouve dans Module.php ? Il y a moyen de récupérer le plugin "redirect" à partir de l'objet MvcEvent ?
Hors ligne