Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 03-06-2016 10:56:01

tmahamadou01
Nouveau membre
Date d'inscription: 22-04-2016
Messages: 7

Authentification ZF2 / Hidden Menu

Bonjour a tous ,

je travaille actuellement sur un site . je veux que lorsque le user est connecté afficher certains menu qui sont masqués lorsqu'il n'est pas connecté , mais j'ai aucune idée sur le fonctionnement.
Merci

Hors ligne

 

#2 03-06-2016 12:58:11

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Authentification ZF2 / Hidden Menu

Bonjour,

Alors là brut de décoffrage, dis comme cela je ne peux que t'orienter sur des pistes (a suivre dans l'ordre) :

- ACL / RBAC (le choix t'appartient)
- Bosser le composant menu (navigation) de Zend ou prendre un module de la communauté (Spiffy navigation) ou custom si ton site en as implémenté une
- Mise en place d'un menu selon les droits sur cette navigation avec la couche RBAC/ ACL selon ton choix.


J'y avait bossé un peu y a quelque temps ce post m'avait aidé :
http://stackoverflow.com/questions/1894 … n-and-rbac


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 03-06-2016 16:35:45

tmahamadou01
Nouveau membre
Date d'inscription: 22-04-2016
Messages: 7

Re: Authentification ZF2 / Hidden Menu

Merci pour ta contribution , je testerai tous ces astuces et bientot je ferai un retour.

Hors ligne

 

#4 24-06-2016 12:11:02

tmahamadou01
Nouveau membre
Date d'inscription: 22-04-2016
Messages: 7

Re: Authentification ZF2 / Hidden Menu

Bonjour a tous .
je reviens de nouveau vers vous pour demander votre aide.
j'ai toujours pas trouver solution a mon problème.

j'explique :
j'utilise les ACL
je veux que les menu de ma navigation s'affiche en fonction du User et des droits qui lui sont attribués.

Du genre avant ma connexion dans la navigation j'ai menu1 et connexion , et après ma connexion je veux un truc du genre menu1 | menu2 |menu 3 |nom_du_user_connecté .

Merci

Hors ligne

 

#5 24-06-2016 18:46:12

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Authentification ZF2 / Hidden Menu

Bonjour,

Sans code, sans nous dire ce que tu as testé, et hormis le fait que j'ai déjà donné le max que je pouvais en rapport avec ce que tu as dis, je vois mal quoi dire de plus....

Tu utilises les ACL avec quoi ? BjyAuthorize ? La doc ne t'en as pas dis plus ? Comment appelle tu ta navigation ? Comment dis tu quels droits sont données aux routes ? Comment gère tu ton roleProvider ???

Je sais pas quoi te dire et sur ce forum personne ne fera le travail a ta place..

A bientôt.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#6 27-07-2016 12:19:48

tmahamadou01
Nouveau membre
Date d'inscription: 22-04-2016
Messages: 7

Re: Authentification ZF2 / Hidden Menu

Bonjour a tous.

j'ai suivie le tuto de Bakura sur les permissions avec Zend , j'utilise les ACL .
dans mon module principal , j'ai declaré ceci :

Code:

[lang=php]
public function init(ModuleManager $moduleManager)
    {
        $events = $moduleManager->getEventManager();
        $sharedEvents = $events->getSharedManager();
        // Attache l'évènement d'ACL
        $sharedEvents->attach('Zend\Mvc\Controller\ActionController', MvcEvent::EVENT_DISPATCH, function(MvcEvent $e)                                                                        {
            $serviceManager = $e->getApplication()->getServiceManager();
            $acl = $serviceManager->get('GbataAcl');
            $acl->dispatch($e);
        }, 100);
    }

et j'ai creer une factory dans le service manager :

Code:

[lang=php]
'GbataAcl' => function($sm) {
                $authenticationService = $sm->get('Zend\Authentication\AuthenticationService');
                $acl = new Gbata\Acl\Acl($sm, $authenticationService);
                return $acl;
            },

et ma classe ACL resemble a ceci :

Code:

[lang=php]
<?php
/**
 * Created by PhpStorm.
 * User: mahamadou
 * Date: 27/07/16
 * Time: 10:21
 */

namespace Gbata\Acl;

use Zend\Acl\Acl as BaseAcl,
    Zend\Authentication\AuthenticationService,
    Zend\Mvc\MvcEvent,
    Zend\Mvc\Router\RouteMatch,
    Zend\ServiceManager\ServiceManager;

class Acl extends BaseAcl
{
    /**
     * Rôle par défaut
     */
    const DEFAULT_ROLE = 'guest';

    /**
     * @var \Zend\ServiceManager\ServiceManager
     */
    protected $serviceManager;

    /**
     * @var \Zend\Authentication\AuthenticationService
     */
    protected $authenticationService;

    /**
     * Route vers laquelle on redirige si les accès ne sont pas valides
     *
     * @var string
     */
    protected $redirectTo = 'home';


    /**
     * @param \Zend\ServiceManager\ServiceManager $serviceManager
     * @param \Zend\Authentication\AuthenticationService $authenticationService
     */
    public function __construct(ServiceManager $serviceManager, AuthenticationService $authenticationService = null)
    {
        $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, $this->redirectTo);
        }
    }

    /**
     * @param \Zend\ServiceManager\ServiceManager $serviceManager
     * @return Acl
     */
    public function setServiceManager(ServiceManager $serviceManager)
    {
        $this->serviceManager = $serviceManager;

        return $this;
    }

    /**
     * Initialise les rôles à partir du fichier de configuration
     */
    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;
    }

    /**
     * @param \Zend\Mvc\MvcEvent $e
     * @param string $route
     */
    private function redirect(MvcEvent $e, $route)
    {
        $url = $e->getRouter()->assemble(array(), array('name' => $route));
        $response = $e->getResponse();
        $response->headers()->addHeaderLine('Location', $url);
        $response->setStatusCode(302);
        $response->sendHeaders();

        exit;
    }
}

Mon souci c'est que lorsque je place un var_dump dans ma classe , celui ci n'est pas pri en compte , du genre ma factory n'appelle pas correctement ma classe ACL .

Merci

EDIT modérateur : Merci de bien penser aux balises permettant la colorisation syntaxique du code. Cela nous aide a mieux vous aider wink

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