IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Acl & Zend_Auth PHP Discussion :

Mis en place des autorisations


Sujet :

Zend_Acl & Zend_Auth PHP

  1. #1
    Membre éclairé Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Par défaut Mis en place des autorisations
    Bonjour à tous,

    Voila une question récurrente, malgré avoir consulter 'quasi tous' les tuto + le livre de Mr Pauli, j'ai du mal à mettre en place la gestion des utilisateurs pour mon site web. Et peut etre que ce post pourra aider d'autre personne.

    Pour un soucis de comprhénsion, dans un premier temps, je souhaite partir d'un exemple très basique, à savoir si je suis administrateur, j'affiche un lien 'admin' si je suis 'guest' aucun lien.

    analyse:
    ressource=administration
    role=admin
    acces=lecture

    bootstrap.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    ...
    	//ZEND_SESSION : initialisation de la session
    	$session = new Zend_Config_Ini('../application/session.ini', APP_MODE_SESSION);
    	Zend_Session::setOptions($session->toArray());
    	Zend_Registry::set('session',$session);	
    		//Creation d un espace de nom
    	$sessionMVC = new Zend_Session_Namespace('MVC');
    	Zend_Registry::set('MVC_RedirectorToOrigin', $sessionMVC);
     
    	//ZEND_ACL : création des autorisations des utilisateurs
    	if(!isset($session->acl)){
    		$acl = new Zend_Acl();
            $acl->add(new Zend_Acl_Resource('administration'));
    		//roles
    		$acl->addRole(new Zend_Acl_Role('admin'));
    		// Accès sans aucune restriction
            $acl->allow('admin'); 
    		Zend_Registry::set('acl',$acl);
    		$sessionMVC->acl = $acl;
    	}
    ...
    Ici j'ai créé ma ressource 'administration' et mon utilisateur 'admin', je lui accorde tous les droits

    1. Authentification
    Je créé un LoginController, qui comporte un formulaire récupérant les infos insérés, et je procède à l'authentification :
    LoginController.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    					$db = Zend_Registry::get('db');
    					//$db = Zend_Db_Table_Abstract::getDefaultAdapter();
    					$dbAdapter = new Zend_Auth_Adapter_DbTable($db);
    					//structure de notre tableu utilisateur
    					$dbAdapter->setTableName('users');
    					$dbAdapter->setIdentityColumn('username');
    					$dbAdapter->setCredentialColumn('password');
    					//champs envoyes par l utilisateur
    					$dbAdapter->setCredential($password)->setIdentity($username);
    					//authentification
    					$auth = Zend_Auth::getInstance();
    					//enregistrement en session
    					$result = $auth->authenticate($dbAdapter);
    					if($result->isValid())
    					{
    						//sauvegarde tous les details sauf le password
    						$data = $dbAdapter->getResultRowObject(null, 'password');
    						$auth->getStorage()->write($data);
    						$this->view->message = 'Login success.';
    						//redirection a la page d accueil
    						$this->_helper->redirector('index', 'index');
    					}else	{
    						// failure: clear database row from session
    						$this->view->message = 'Login failed.';
    					}
    Je me retrouve identifié, et la je bloque sur la suite du déroulement du processus. Que faut il faire ? un plugin SetAcl ?..

    Merci d'avance de votre aide

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Pour commencer, dans ton bootstrap, tu devrais tester si '$sessionMVC->acl' existe et pas si '$session->acl' existe... L'idée est de stocker les ACL dans les données de session pour éviter d'avoir à les recalculer à chaque requête. Donc il faut commencer par tester si la session contient déjà les infos des acl, et si ce n'est pas le cas les y placer...

    Pour savoir s'il faut afficher ou pas le lien, il faut déjà que tu récupères le rôle de l'utilisateur (je vais supposer qu'il est dans la table users, et donc stocké avec Zend_Auth). Ensuite, il faut que tu vérifies si l'utilisateur a le droit d'aller dans ta page d'administration en utilisant la méthode isAllowed().

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $lienAdmin = false; // variable à passer à la vue pour savoir si le lien doit être affiché ou pas
    $auth = Zend_Auth::getInstance();
    if ($auth->hasIdentity())
    {
        // récupération du rôle à partir des données de Zend_Auth
        $role = $auth->getIdentity()->role;
        // test du rôle
        $lienAdmin = $acl->isAllowed($role, 'administration');
    }
    Pour aller plus loin, il faudra protéger ta page d'administration (même si le lien est absent, on pourrait saisir directement l'url...). Pour ça, on utilise souvent un plugin ou une aide de vue. il y a différentes possibilités et il n'y a pas une solution parfaite... Tout dépend de l'application que tu veux créer.

    Par exemple je n'initialise pas les ACL dans le bootstrap, et je ne les stocke pas dans une session, mais je les initialise dans chaque contrôleur (dans la fonction init(), avec uniquement les ACL pour ce contrôleur). J'ai une aide d'action qui simplifie cette déclaration, et qui vérifie ensuite en preDispatch que l'utilisateur a bien le droit d'accéder à l'action demandée.

  3. #3
    Membre éclairé Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Par défaut
    D'accord! Maintenant, avec l'ensemble des tutos que j'ai lu, je comprend mieux avec tes explications.

    En faite, de mon côté, ma table user est construite ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `users` (
    	`idUsers` INT NOT NULL AUTO_INCREMENT,
    	`username` VARCHAR(50) NOT NULL,
    	`password` VARCHAR(50) NOT NULL,
    	`real_name` VARCHAR(100) NOT NULL,
    	`email` VARCHAR(100) NOT NULL,
    	PRIMARY KEY (`idUsers`)
    )	ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    elle ne contient pas le rôle de mon utilisateur, c'est peut etre pour ca que je bloquais... je vais donc rajouter le champs.

    Mais, ce que j'ai pu entendre, c'est que ce n'était pas forcément correct de mettre le role de l'utilisateur dans la table, ou j'ai peut etre délirer?

    Concernant la méthode isAllowed() s'est bien une aide de vue?

    Comme tu as pu m'aider sur la création de mon Menu ici:
    http://www.developpez.net/forums/d75...tion-aide-vue/

    dans ma vue menu.phtml (et non pas l'aide de vue SetMenu()!? ), il faut que j'appelle l'aide de vue IsAllowed(), si elle me renvoit true alors j'affiche ma page admin dans mon menu ?

    Je retiens ta pensée sur initialiser ses droits dans les init de mes controller, car mon site possede un blog, et je pense pouvoir adapter le code de Pauli sur les reservations.

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par miya Voir le message
    Mais, ce que j'ai pu entendre, c'est que ce n'était pas forcément correct de mettre le role de l'utilisateur dans la table, ou j'ai peut etre délirer?
    Tout dépend de ce que tu veux gérer. Mais si un utilisateur a un et un seul rôle, une bonne solution est en général de créer une table rôle avec un identifiant et un libellé, et de stocker dans la table des utilisateurs l'identifiant du rôle correspondant...

    Citation Envoyé par miya Voir le message
    Concernant la méthode isAllowed() s'est bien une aide de vue?
    Non, c'est une méthode de l'objet Zend_Acl (celui que tu stockes dans la session)

    Citation Envoyé par miya Voir le message
    Comme tu as pu m'aider sur la création de mon Menu ici:
    http://www.developpez.net/forums/d75...tion-aide-vue/

    dans ma vue menu.phtml (et non pas l'aide de vue SetMenu()!? ), il faut que j'appelle l'aide de vue IsAllowed(), si elle me renvoit true alors j'affiche ma page admin dans mon menu ?
    En fait je te proposais plutôt de tester les droits de l'utilisateur dans ton contrôleur, et de passer la variable $lienAdmin à ta vue.

    De cette façon, ta vue n'a pas à se poser la question de savoir si l'utilisateur est connecté ou pas, n'a pas à savoir où est l'objet Zend_Acl, mais se contente d'afficher le lien si $lienAdmin est vrai (que ce soit vrai parce que l'utilisateur est autorisé, ou pour une autre raison, ce n'est pas le problème de la vue).

    Pour faire le lien avec ton aide de vue Menu, tu peux par exemple passer cette variable en paramètre à ton aide de vue... Si tu ne constituait pas le menu dans ton aide de vue (ce que je t'avais proposé), alors c'est dans ton contrôleur que tu pourrais récupérer les éléments de menu et les filtrer en fonction des droits de l'utilisateur avant de les passer à la vue...

  5. #5
    Membre éclairé Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Par défaut
    Rebonjour Eusebe,

    J'ai bien tenté de suivre des indications, mais je me suis heurté à quelques problèmes, je suis donc parvenu à une fin, en m'aidant aussi de ce site :
    http://www.wowww.ch/index.php?post/2...th-et-Zend-Acl

    - toujours le meme bootstrap.php

    j'ai créé une aide de vue IsAllowed() que j'appel dans ma vue menu.phtml, et vérifie si j'ai les droits pour afficher mon lien admin :

    IsAllowed.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class Zend_View_Helper_IsAllowed 
    {  
    	protected $_acl;  
    	protected $_auth;  
     
    	public function isAllowed($resource, $actions) 
    	{  
    		$this->_acl = Zend_Registry::get('acl') ;  
    		$this->_auth = Zend_Auth::getInstance() ;  
     
    		 // contrôle si l'utilisateur est authentifié  
    		if ($this->_auth->hasIdentity()) {
    		    $role = $this->_auth->getIdentity()->role;
    		} else {  
    		   // non = invité  
    		   $role = 'guest';  
    		}   
    		 // contrôle si l'utilisateur est autorisé  
    		return $this->_acl->isAllowed($role, $resource, $actions) ;  
    	}  
    }
    menu.phtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <ul id="mainNav">
    	<?php
    		//appel l aide de vue pour la mise en place du menu principal
    		echo $this->setMenu();
    		//test les droits admin
    		if($this->IsAllowed('administration', null)){
    			//si ok affiche le lien admin
    	?>
    			<li><a href="<?php echo $this->url(array('controller'=>'admin', 'action'=>'index'), 'default', true); ?>">Administration</a></li>
    	<?php	
    		}
    	?>
    </ul>

Discussions similaires

  1. Dégradation des performances Après mis en place du réplication
    Par Boubou2020 dans le forum Réplications
    Réponses: 1
    Dernier message: 28/01/2015, 16h25
  2. Réponses: 2
    Dernier message: 21/08/2013, 16h45
  3. Place des tables de dimention dans un outil ETL
    Par ilyassou dans le forum Alimentation
    Réponses: 2
    Dernier message: 21/08/2005, 13h38
  4. [JSP][Tomcat] COmment choisir la place des fichiers .class?
    Par mathieu dans le forum Tomcat et TomEE
    Réponses: 16
    Dernier message: 03/03/2004, 09h24
  5. Place des autodidactes sur le marché du travail
    Par Argh! dans le forum Emploi
    Réponses: 21
    Dernier message: 24/05/2003, 22h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo