Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
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
Hors ligne
Merci pour ta contribution , je testerai tous ces astuces et bientot je ferai un retour.
Hors ligne
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
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.
Hors ligne
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 :
[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 :
[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 :
[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
Hors ligne