Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-06-2013 15:07:40

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

[Resolu] Rediction dans le Bootstrap

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')wink.

Je n'ai qu'une simple question , comment effectuer une redirection vers un route dans le bootstrap ?

Merci,d'avance pour votre aide.

Code:

[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

 

#2 12-06-2013 15:19:34

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Resolu] Rediction dans le Bootstrap

Salut, pour t'aider il faudrait qu'on ai connaissance de l'erreur big_smile.

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

 

#3 12-06-2013 15:32:27

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Resolu] Rediction dans le Bootstrap

Merci Orkin

Code:

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

 

#4 12-06-2013 17:04:13

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Resolu] Rediction dans le Bootstrap

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

 

#5 13-06-2013 09:41:24

Hanyas
Membre
Date d'inscription: 23-05-2013
Messages: 13

Re: [Resolu] Rediction dans le Bootstrap

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 :

Code:

[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

Code:

[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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages