Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-01-2014 10:07:25

oxomichael
Nouveau membre
Date d'inscription: 06-08-2010
Messages: 3

Création d'un module d'authentification

Bonjour,

Je souhaite passer toutes les applications web de ma société de ZF1 à ZF2.
Après de longue lecture, j'ai encore quelques difficultés à appréhender la construction d'un module, etc....

J'ai un besoin spécifique pour toutes ces applications et particulièrement au niveau de l'authentification.

J'ai tout d'abord créer un nouvel adaptateur d'authentification \MyUser\Authentication\Adapter\DbTable
et un nouvel adaptateur de stockage \MyUser\Authentication\Storage\Session

Voici comment cela se présente

Code:

[lang=php]//Module.php

<?php
class Module
{
    //....
    
    public function getServiceConfig()
    {
        return array(
            'invokables' => array(
                'MyUser\Form\Login' => 'MyUser\Form\Login',
                'MyUser\Authentication\Storage\Session' => 'MyUser\Authentication\Storage\Session',
            ),
            'factories' => array(

                'MyUserOptions' => function ($sm) {
                    $config = $sm->get('Config');
                    return new Options\ModuleOptions(isset($config['MyUser']) ? $config['MyUser'] : array());
                },

                'MyUserAuthStorage' => function($sm) {
                    $options = $sm->get('MyUserOptions');
                    return new \MyUser\Authentication\Storage\Session('sdauth');
                },

                'MyUserAuthService' => function ($sm) {
                    $dbAdapter = $sm->get('bigdataSdv1');
                    $authAdapter = new \MyUser\Authentication\Adapter\DbTable($dbAdapter, 'utilisateurs', 'login', 'password', '?');
                    //$authAdapter = new \Zend\Authentication\Adapter\DbTable($dbAdapter, 'utilisateurs', 'login', 'password', '?');

                    $authService = new \Zend\Authentication\AuthenticationService();
                    $authService->setAdapter($authAdapter);
                    $authService->setStorage($sm->get('MyUserAuthStorage'));

                    return $authService;
                },
            ),
        );
    }

    public function getViewHelperConfig()
    {
        return array(
            'factories' => array(
                'MyUserDisplayName' => function ($sm) {
                    $locator = $sm->getServiceLocator();
                    $viewHelper = new View\Helper\MyUserDisplayName;
                    $viewHelper->setAuthService($locator->get('MyUserAuthService'));
                    return $viewHelper;
                },
            ),
        );
    }

    public function onBootstrap(MvcEvent $e)
    {
        $em = $e->getApplication()->getEventManager();

        //Check Authentication
        $em->attach('route', array($this, 'checkAuthenticated'));

        //Override Layout
        //$em->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController', 'dispatch', array($this, 'overrideLayout'), 100);
        $em->attach('dispatch', array($this, 'overrideLayout'));
    }

    /**
     * Override layout for action "login" and "logout"
     * @param MvcEvent $e
     */
    public function overrideLayout(MvcEvent $e)
    {
        //$controller = $e->getTarget();
        //$controllerClass = get_class($controller);
        //$moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));

        $routeMatch = $e->getRouteMatch();
        if ( in_array($routeMatch->getParam('action'), array('login','logout') ) ) {

            $controller = $e->getTarget();
            $controller->layout('layout/layout.phtml');
        }
    }

    /**
     * Return true if "login" or "logout" Action is open
     * @param MvcEvent $e
     * @return boolean
     */
    public function isOpenRequest(MvcEvent $e)
    {
        $routeMatch = $e->getRouteMatch();
        if ( in_array($routeMatch->getParam('action'), array('login','logout') ) ) {

            return true;
        }

        return false;
    }

    /**
     * Check if the user is authenticated
     * @param MvcEvent $e
     */
    public function checkAuthenticated(MvcEvent $e)
    {
        if ( !$this->isOpenRequest($e) ) {

            $sm = $e->getApplication()->getServiceManager();
            if (! $sm->get('MyUserAuthService')->getStorage()->read($sm->get('MyUserAuthService')->getStorage()->getSessionId())) {
                $e->getRouteMatch()
                    ->setParam('controller', 'MyUser\Controller\User')
                    ->setParam('action', 'login');
            }
        }
    }

}

A partir de là je pense qu'il y a déjà des choses à améliorer. Mais en plus je souhaiterais pouvoir avoir plusieurs adaptateurs d'authentification et de stockage différents suivant les applications.

En fonction de la configuration des applications certaines doivent pourvoir se connecter à partir d'une base de données ou à partir d'une api. De même pour le stockage qui peut être uniquement en Session ou en Session + Database.

Si quelqu'un à des conseils ou des explications pour m'orienter cela serait appréciable.

Hors ligne

 

#2 23-01-2014 10:20:08

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

Re: Création d'un module d'authentification

Salut, déjà il faut éviter de mettre la config dans le Module.php (c'est vraiment quand il n'y a pas d'autres solutions).

Je te conseil donc de déporter "serviceConfig" et "viewHelperConfig" dans module.config.php. Ensuite je te conseil aussi de faire des classes factory plutôt que des fonctions anonymes. C'est plus propre et si tu pourras mettre ta configuration en cache.

Sinon à vu d'oeil le code a l'air plutôt propre (penses à faire des imports, avec les namespace ça évite d'avoir des noms de classes à rallonge).

De même dans onBootstrap tu as plus ou moins la bonne méthode pour attacher des évènements par contre de la même manière créé plutôt une classe Listener que tu vas attacher c'est aussi plus propre et du coup tu aurras des méthodes overrideLayout, isOpenRequest et checkAuthenticated dans ces classes Listener plutôt que dans le Module.php. Si c'est une grosse application ça risque de devenir le foutoir.

Concernant les adapters je pense que le mieux c'est d'avoir des entrées différentes dans le service manager pour une même application puisque la configuration est mergée entre tous les modules. Dans le cas contraire tu peux utiliser un système d'alias qui pointe vers l'un ou l'autre adapter (si t'as un module générique qui propose tous tes adapters et que tu n'en as besoin que d'un seul par application). Un peu comme l'authenticationService quand tu veux utiliser celui de doctrine.

Hors ligne

 

#3 23-01-2014 11:07:44

oxomichael
Nouveau membre
Date d'inscription: 06-08-2010
Messages: 3

Re: Création d'un module d'authentification

Merci pour la réponse,

J'avais compris que pour des raisons de performance, il fallait supprimer tout les ....Config du Module.php et éviter les fonctions anonymes.

Et c'est là que cela bloque.......

Je n'arrive pas encore à me représenter comment organiser mon module et donc travailler avec des classes Factory, Listerner, ...
Est ce que mon problème ne viendrait pas que je n'arrive pas encore à appréhender correctement l'injection de dépendance, ..., développement par contrat

Est ce qu'il existe un exemple basique qui recense des pré-requis, convention de nommage qui peuvent m'aider ?

Hors ligne

 

#4 23-01-2014 11:20:55

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

Re: Création d'un module d'authentification

Tu devrais pouvoir avoir un début de réponse ici : https://github.com/Grafikart/BlogMVC/tr … Framework2

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