Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je reviens vers vos lumières afin de régler un petit détail.
J'aimerai effectuer une redirection dans le bootstrap, sachant que je récupère ce dernier par le biais du ControllerPluginManager.
Résultat il ne vient pas directement du contrôleur, il bug lors de ma dernière ligne ($redirector->toRoute('main').
Je n'ai qu'une simple question , comment effectuer une redirection vers un route dans le bootstrap ?
Merci,d'avance pour votre aide.
[lang=php] public function onBootstrap(\Zend\Mvc\MvcEvent $e) { $app = $e->getParam('application'); $sm = $app->getServiceManager(); $app->getEventManager()->attach('route', array($this, 'onRoute')); } public function onRoute(\Zend\Mvc\MvcEvent $e){ //Recupere les informations de la root $app = $e->getTarget(); $match = $app->getMvcEvent()->getRouteMatch(); //Recupere le $module ... $controller = $e->getTarget(); $controllerClass = get_class($controller); $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\')); //... le controller et l'action $controller = $match->getParam('controller'); $action = $match->getParam('action'); //Gestionnaire des service et des plugins $sm = $app->getServiceManager(); $plugins = $sm->get('ControllerPluginManager'); //Service autentification $authService = $sm->get('auth_service'); //teste l'identification de l'utilisateur if($authService->hasIdentity()){ }else{ if($moduleNamespace != 'Auth'){ $redirector = $plugins->get('Redirect'); $redirector->toRoute('main'); } } }
Dernière modification par Hanyas (13-06-2013 14:53:40)
Hors ligne
Salut, pour t'aider il faudrait qu'on ai connaissance de l'erreur .
Sinon pour la redirection il y a des choses similaires qui ont été faites sur le forum pour l'authentification et la restriction d'accès via les ACLs tu devrais trouver assez facilement ton bonheur.
Je sais pas si c'est possible mais tu pourrais éventuellement modifier directement la route.
Hors ligne
Merci Orkin
Fatal error: Uncaught exception 'Zend\Mvc\Exception\DomainException' with message 'Redirect plugin requires a controller that defines the plugin() method' in /var/www/TestZend2/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/Plugin/Redirect.php on line 40 Zend\Mvc\Exception\DomainException: Redirect plugin requires a controller that defines the plugin() method in /var/www/TestZend2/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/Plugin/Redirect.php on line 40
Voila mon erreur.
je n'ai pas du bien regarder dans le forum.
Edit : peut ton récupérer le contrôleur dans le bootstrap ? afin d'utiliser getPluginManager().
Dernière modification par Hanyas (12-06-2013 16:53:02)
Hors ligne
Salut de ce que je vois dans le message d'erreur c'est que le plugin a besoin d'un contrôleur pour fonctionner. Donc si tu regardes ce que fais le PluginManager c'est d'injecter le contrôleur au plugin après l'avoir instancié donc tu dois passer le contrôleur à ton pluginManager.
Ah mon avis si tu fais $plugins->getController() tu doit avoir null qui est retourné.
Hors ligne
Je suis tout a fait d'accord et j’étais arrivé à la même conclusion.
Je me disais donc qu'il fraudait que je récupère le contrôleur appelé et d'utiliser son Redirect()->toRoute.
Je pensais pouvoir le récupérer grâce à $app = $e->getTarget(). Mais je ne sais pas comment l'utiliser pour accéder à l'option Redirect.
Ps: j'ai cherché sur le forum les différents posts qui pourrait m’intéresser, je suis tombé sur http://www.z-f.fr/forum/viewtopic.php?id=7616. Il n'est plus à jour, mais j’essaierais d'adapter mon code plus tard pour le prendre en compte les ACL.
Edit :
C'est bon j'ai modifié le code de bakura voici ce que ça donne :
[lang =php] <?php namespace Auth\Controller\Plugin; use Zend\Authentication\AuthenticationService, Zend\Mvc\MvcEvent, Zend\Mvc\Router\RouteMatch, Zend\ServiceManager\ServiceManager, Zend\Mvc\Controller\Plugin\AbstractPlugin, Zend\Permissions\Acl\Acl as BaseAcl; class LoginAcl extends BaseAcl//AbstractPlugin { /** * Rôle par défaut */ const DEFAULT_ROLE = 'guest'; /** * @var \Zend\ServiceManager\ServiceManager */ protected $serviceManager; /** * @var \Zend\Authentication\AuthenticationService */ protected $authenticationService; /** * @param \Zend\ServiceManager\ServiceManager $serviceManager * @param \Zend\Authentication\AuthenticationService $authenticationService */ public function __construct(ServiceManager $serviceManager, AuthenticationService $authenticationService) { $this->serviceManager = $serviceManager; $this->authenticationService = $authenticationService; $this->initRoles(); } /** * @param \Zend\Mvc\MvcEvent $e */ public function dispatch(MvcEvent $e) { $this->build($e->getRouteMatch()); // Récupération de l'utilisateur courant $role = $this->authenticationService->getIdentity(); if ($role == null) { $role = self::DEFAULT_ROLE; } // Si l'utilisateur n'est pas autorisé, on le redirige vers la page par défaut, ou une autre page si elle a été spécifiée // dans le fichier de configuration $matchedRouteName = $e->getRouteMatch()->getMatchedRouteName(); if (!$this->isAllowed($role, $matchedRouteName)) { $this->redirect($e,'login'); } } private function initRoles() { $configuration = $this->serviceManager->get('Configuration'); if (isset($configuration['acl']['roles'])) { $roles = $configuration['acl']['roles']; foreach($roles as $role => $parents) { $this->addRole($role, $parents); } } } /** * @param \Zend\Mvc\Router\RouteMatch $routeMatch * @return mixed */ private function build(RouteMatch $routeMatch) { // Récupération de la configuration $configuration = $this->serviceManager->get('Configuration'); $matchedRouteName = $routeMatch->getMatchedRouteName(); if (isset($configuration['acl']['resources'])) { $resources = $configuration['acl']['resources']; $routeParts = explode('/', $routeMatch->getMatchedRouteName()); $parentPart = null; foreach($routeParts as $routePart) { $this->addResource($routePart, $parentPart); // Par défaut, on interdit l'accès à toute ressource dont l'ACL n'a pas été défini if (!isset($resources[$routePart])) { $this->deny(self::DEFAULT_ROLE, $routePart); return; } $resources = $resources[$routePart]; if (isset($resources['allow'])) { $allow = $resources['allow']; $assertion = $this->buildAssertion($allow); $this->allow($allow['roles'], $routePart, null, $assertion); } if (isset($resources['deny'])) { $deny = $resources['deny']; $assertion = $this->buildAssertion($deny); $this->deny($deny['roles'], $routePart, null, $assertion); } if (isset($resources['redirect_to'])) { $this->redirectTo = $resources['redirect_to']; } // Y a-t-il des enfants ? if (!isset($resources['child_resources'])) { break; } $resources = $resources['child_resources']; $parentPart = $routePart; } // On définit la route "complète" comme enfant de la dernière ressource afin d'hériter de ses autorisations if (count($routeParts) > 1) { $this->addResource($matchedRouteName, end($routeParts)); } } } /** * @param array $resourcePart * @return null */ private function buildAssertion(array $resourcePart) { if (isset($resourcePart['assertion'])) { return new $resourcePart['assertion'](); } return null; } private function redirect(MvcEvent $e, $route) { $url = $e->getRouter()->assemble(array(), array('name' => $route)); $response = $e->getResponse(); $response->getHeaders()->addHeaderLine('Location', $url); $response->setStatusCode(302); $response->sendHeaders(); exit; } }
Dans le module
[lang=php] public function getServiceConfig() { return array( 'factories' => array( 'Common\Acl\Acl' => function($serviceManager) { $authenticationService = new AuthenticationService(new SessionStorage('auth')); $acl = new LoginAcl($serviceManager, $authenticationService); return $acl; }, 'auth_service' => function ($sm) { $authService = new AuthenticationService(new SessionStorage('auth')); //$authService->setStorage(new SessionStorage('auth')); return $authService; }, 'twitter_oauth' => function ($sm) { $httpConfig = array( 'adapter' => 'Zend\Http\Client\Adapter\Socket', 'sslverifypeer' => false ); $httpClient = new HTTPClient(null, $httpConfig); OAuth::setHttpClient($httpClient); $config = $sm->get('Config'); $consumer = new \ZendOAuth\Consumer($config['twitter']); return $consumer; }, 'Auth\Model\UserTable' => function($sm) { $tableGateway = $sm->get('UserTableGateway'); $table = new UserTable($tableGateway); return $table; }, 'UserTableGateway' => function ($sm) { $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new User()); return new TableGateway('user', $dbAdapter, null, $resultSetPrototype); }, ) ); } public function onBootstrap(\Zend\Mvc\MvcEvent $e) { $app = $e->getParam('application'); $sm = $app->getServiceManager(); //$app->getEventManager()->attach('route', array($this, 'onRoute2')); $app->getEventManager()->attach('route', array($this, 'onRoute')); } public function onRoute(\Zend\Mvc\MvcEvent $e){ $serviceManager = $e->getApplication()->getServiceManager(); $acl = $serviceManager->get('Common\Acl\Acl'); $acl->dispatch($e); }
Dernière modification par Hanyas (13-06-2013 14:52:56)
Hors ligne