Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-06-2013 12:22:34

jerem44
Nouveau membre
Lieu: nantes
Date d'inscription: 18-06-2013
Messages: 6

verification Acl dans bootstrap

Bonjour à tous

Je sollicite votre aide.
J'ai tenté de reproduire ce tutoriel http://p0l0.binware.org/index.php/2012/ … ntmanager/

Je tente de vérifier l'accès d'un utilisateur via les ACL directement dans le bootstrap du modèle User mais je rencontre cette erreur :

Fatal error: UFatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'Zend\Mvc\Controller\PluginManager::get was unable to fetch or create an instance for getServiceManager' in /home/www-data/zend/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:496

Voici le code du module en question :

Code:

[lang=php]namespace User;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ModuleManager\ModuleManager;
use Zend\EventManager\EventInterface as Event;
use    Zend\EventManager\StaticEventManager;
use Zend\ModuleManager\Feature\BootstrapListenerInterface;

class Module  implements BootstrapListenerInterface
{

     public function onBootstrap(Event  $event)
    {
         $app            = $event->getApplication();
          $events = $app->getEventManager();
        $events->attach('dispatch', array($this, 'check'));
     }


    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }  
    
     public function check($event) {        

         $sm = $event->getApplication()->getServiceManager();
         $sm->get('User/Event/Authentication');  // CA PLANTE ICI
        return $this->preDispatch($event);
    }
    
}

Je fais appel à User/Event/Authentication et à la fonction preDispatch qui donne accès ou non à une page.

Code:

[lang=php]<?php

namespace User\Event;

use Zend\Mvc\MvcEvent as MvcEvent,
    User\Controller\Plugin\UserAuthentication as AuthPlugin,
    User\Acl\Acl as AclClass;

class Authentication
{
    /**
     * @var AuthPlugin
     */
    protected $_userAuth = null;

    /**
     * @var AclClass
     */
    protected $_aclClass = null;

    /**
     * preDispatch Event Handler
     *
     * @param \Zend\Mvc\MvcEvent $event
     * @throws \Exception
     */
    public function preDispatch(MvcEvent $event)
    {
        //@todo - Should we really use here and Controller Plugin?
        $userAuth = $this->getUserAuthenticationPlugin();
        $acl = $this->getAclClass();
        $role = AclClass::DEFAULT_ROLE;
        $role='guest';

        if ($userAuth->hasIdentity()) {
            $user = $userAuth->getIdentity();
            $role = 'member'; //@todo - Get role from user!
        }

        $routeMatch = $event->getRouteMatch();
        $controller = $routeMatch->getParam('controller');
        $action     = $routeMatch->getParam('action');

        if (!$acl->hasResource($controller)) {
            throw new \Exception('Resource ' . $controller . ' not defined');
        }

        if (!$acl->isAllowed($role, $controller, $action)) {
            $url = $event->getRouter()->assemble(array(), array('name' => 'login'));
            $response = $event->getResponse();
            $response->headers()->addHeaderLine('Location', $url);
            $response->setStatusCode(302);
            $response->sendHeaders();
            exit;
        }
    }

    /**
     * Sets Authentication Plugin
     *
     * @param \User\Controller\Plugin\UserAuthentication $userAuthenticationPlugin
     * @return Authentication
     */
    public function setUserAuthenticationPlugin(AuthPlugin $userAuthenticationPlugin)
    {
        $this->_userAuth = $userAuthenticationPlugin;

        return $this;
    }

    /**
     * Gets Authentication Plugin
     *
     * @return \User\Controller\Plugin\UserAuthentication
     */
    public function getUserAuthenticationPlugin()
    {
        if ($this->_userAuth === null) {
            $this->_userAuth = new AuthPlugin();
        }

        return $this->_userAuth;
    }

    /**
     * Sets ACL Class
     *
     * @param \User\Acl\Acl $aclClass
     * @return Authentication
     */
    public function setAclClass(AclClass $aclClass)
    {
        $this->_aclClass = $aclClass;

        return $this;
    }

    /**
     * Gets ACL Class
     *
     * @return \User\Acl\Acl
     */
    public function getAclClass()
    {
        if ($this->_aclClass === null) {
            $this->_aclClass = new AclClass(array());
        }

        return $this->_aclClass;
    }
}

Ma classe Acl est juste une extension de la classe Zend : ZendAcl .

Voici ma config : (User/config/module.config.php)

Code:

[lang=php]<?php
return array(
    'controllers' => array(
        'invokables' => array(
            'User\Controller\User' => 'User\Controller\UserController',
        ),
    ), 
     'controller_plugins' => array(
        'invokables' => array(
           'userAuth' => 'User\Controller\Plugin\UserAuthentication',
         )
     ),
    'service_manager' => array( 
        'invokables' => array( 
            'User\Event\Authentication' => 'User\Event\Authentication', 
        ), 
    ), 
    'di' => array(
        'instance' => array(
            'alias' => array(
                'user' => 'User\Controller\UserController'
            ),
            'user' => array(
                'parameters' => array(
                    'broker' => 'Zend\Mvc\Controller\PluginBroker'
                )
            ),
            'User\Event\Authentication' => array(
                'parameters' => array(
                    'userAuthenticationPlugin' => 'User\Controller\Plugin\UserAuthentication',
                    'aclClass'                 => 'User\Acl\Acl'
                )
            ),
            'User\Acl\Acl' => array(
                'parameters' => array(
                    'config' => include __DIR__ . '/acl.config.php'
                )
            ),
            'User\Controller\Plugin\UserAuthentication' => array(
                'parameters' => array(
                    'authAdapter' => 'Zend\Authentication\Adapter\DbTable'
                )
            ),
            'Zend\Mvc\Controller\PluginLoader' => array(
                'parameters' => array(
                    'map' => array(
                        'userAuthentication' => 'User\Controller\Plugin\UserAuthentication'
                    )
                )
            ),
            
        )
    ),
    
    'router' => array(
        'routes' => array(
            'user' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/user[/][:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'User\Controller\User',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array(
        'template_path_stack' => array(
            'user' => __DIR__ . '/../view',
        ),
    ),
    
    
);

Je ne comprends pas pourquoi je ne peux pas appeler mon module Authentication.
Est ce que je dois créer une factory ?
Et comment ?

Je débute avec la nouvelle version de Zend, j'espère que vous
pourrez m'aider.

Merci,d'avance pour votre aide.

Dernière modification par jerem44 (25-06-2013 14:36:15)

Hors ligne

 

#2 25-06-2013 14:20:15

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

Re: verification Acl dans bootstrap

Salut, pour commencer ça serait cool de dire à quel endroit de ton code ça plante smile.

D'après ce que tu dis ces classes se trouvent dans un module User. Pour ça il faudrait t'assurer que tu as bien ajouter le module dans ton fichier application.config.php. Ensuite le message d'erreur que tu as indique que tu n'as pas d'entrée dans ta configuration pour User\Event\Authentication dans le service manager. Si on regarde ton code il est effectivement en commentaire. Le service manager et le DI ne sont pas la même chose.

Donc pour ton cas je te conseil de faire une factory puisque visiblement tu as besoin de passer des paramètres à ta classe et l'ajouter dans ta configuration pour le service manager.

De plus l'article que tu lis date du mois de Février 2012, il n'est donc plus d'actualité le ZF2 étant encore en beta ou alpha à cette époque de l'année donc beaucoup de choses ont changées.

Hors ligne

 

#3 25-06-2013 14:35:18

jerem44
Nouveau membre
Lieu: nantes
Date d'inscription: 18-06-2013
Messages: 6

Re: verification Acl dans bootstrap

J'ai édité mon message, ca plante dans la fonction check
appelé dans le bootstrap.

J'ai bien ajouté le module User dans mon application.config.php,
je n'ai en effet pas ajouté l'entrée dans mon service manager.
Mais en ajoutant
dans User/config/module.config.php

Code:

'service_manager' => array( 
        'factories' => array( 
            'User\Event\Authentication' => 'User\Event\Authentication', 
        ), 
    ),

J'ai toujours la même erreur. Est ce ma factory est mal configurée ?

Je sais que cet article n'est pas tout récent mais je n'ai trouvé que ce tutoriel pour
faire ce que je souhaite, autoriser ou non l'accès à une page en fonction d'un login, mot de passe
(associé à un role).

Hors ligne

 

#4 25-06-2013 16:12:43

jerem44
Nouveau membre
Lieu: nantes
Date d'inscription: 18-06-2013
Messages: 6

Re: verification Acl dans bootstrap

Cela fonctionne en mettant :

Code:

'service_manager' => array( 
        'factories' => array( 
            'User\Event\Authentication' => function ($serviceManager) {
                $userProfile = new User\Event\Authentication();   
                
                return $userProfile;
        }
        ),

Maintenant mon souci est sur l'utilisation des Acl :

les librairies ne sont plus

Code:

#use Zend\Acl\Acl as ZendAcl;
#use    Zend\Acl\Role\GenericRole as Role;
#use    Zend\Acl\Resource\GenericResource as Resource;

mais

Code:

use Zend\Permissions\Acl\Acl as ZendAcl;
use    Zend\Permissions\Acl\Role\GenericRole as Role;
use    Zend\Permissions\Acl\Resource\GenericResource as Resource;

Modification du preDispatch dans Authentication.php :

Code:

public function preDispatch(MvcEvent $event)
    {
        //@todo - Should we really use here and Controller Plugin?
        $userAuth = $this->getUserAuthenticationPlugin();
        $acl = $this->getAclClass();
        $role = AclClass::DEFAULT_ROLE;
        //$role='guest';

        if ($userAuth->hasIdentity()) {
            $user = $userAuth->getIdentity();
            $role = 'member'; //@todo - Get role from user!
        }

        $routeMatch = $event->getRouteMatch();
        $controller = $routeMatch->getParam('controller');
        $action     = $routeMatch->getParam('action');

        if (!$acl->hasResource($controller)) {
            throw new \Exception('Resource ' . $controller . ' not defined');
        }

        if (!$acl->isAllowed($role, $controller, $action)) {
            $url = $event->getRouter()->assemble(array(), array('name' => 'login'));
            $response = $event->getResponse();
            $response->getHeaders()->addHeaderLine('Location', $url);  //getHeaders
            $response->setStatusCode(302);
            $response->sendHeaders();
            exit;
        }
    }

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