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 :

Exemple simple Zend_Auth/Zend_Acl + BDD ?


Sujet :

Zend_Acl & Zend_Auth PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut Exemple simple Zend_Auth/Zend_Acl + BDD ?
    Bonjour,

    Je débute avec Zend et plus précisément dans le modèle MVC.

    Je me penche sur l'utilisation de Zend_Auth et Zend_Acl et j'ai une question

    J'ai lu les tutoriaux disponibles et ils considèrent tous que les rôles sont stockés/gérés en BDD.
    Aucun ne précise explicitement comment celà fonctionne, c'est à dire comment structurer tout ça (BDD et Zend) pour que Zend_Auth récupère automatiquement les rôles et qu'on connaisse le type d'utilisateur une fois qu'il est connecté.

    Comment faire ?

    Sachant que j'ai pour l'instant pour Zend_Auth un controller avec l'action suivante (copie conforme du tutoriel présent sur developpez) :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    function loginAction()
    	{
    		$this->view->message = '';
     
    		if ($this->_request->isPost()) {
    			// collect the data from the user
    			Zend_Loader::loadClass('Zend_Filter_StripTags');
    			$f = new Zend_Filter_StripTags();
    			$username = $f->filter($this->_request->getPost('username'));
    			$password = $f->filter($this->_request->getPost('password'));
     
    			if (empty($username)) {
    				$this->view->message = 'Please provide a username.';
    			} 
    			else {
    				// setup Zend_Auth adapter for a database table
    				Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
    				$dbAdapter = Zend_Registry::get('dbAdapter');
    				$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
    				$authAdapter->setTableName('users');
    				$authAdapter->setIdentityColumn('username');
    				$authAdapter->setCredentialColumn('password');
     
    				// Set the input credential values to authenticate against
    				$authAdapter->setIdentity($username);
    				$authAdapter->setCredential($password);
     
    				// do the authentication
    				$auth = Zend_Auth::getInstance();
    				$result = $auth->authenticate($authAdapter);
     
    				if ($result->isValid()) {
    					// success: store database row to auth's storage
    					// system. (Not the password though!)
    					$data = $authAdapter->getResultRowObject(null, 'password');
    					$auth->getStorage()->write($data);
    					$this->_redirect('/');
    				} 
    				else {
    					// failure: clear database row from session
    					$this->view->message = 'Login failed.';
    				}
    			}
    		}
    		$this->view->title = "Log in";
    	}


    Ensuite je suis en train de tester les possibilités avec Zend_Acl, et plus précisément l'utilisation de plugins pour tester les autorisations avant de faire appel aux contrôleurs (preDispatch).
    C'est assez complexe au premier coup d'oeil, mais ça prend tout son sens une fois qu'on a compris. J'ai pas encore de question mais ça va peut-être venir.

    Merci,

    Benjamin.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    Ca y est j'ai une question

    Ou stocker les plugins de controllers ?

    Mon arbo est la suivante :

    /application
    --/config
    --/controllers
    ----/plugins
    --/models
    --/views
    ----/helpers
    ----/layouts
    ----/scripts
    /html

    Comment indiquer au front controller où récupérer les plugins ? par un loadclass dans le bootstrap ?

    Merci.

    Benjamin.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Où tu veux ;-) mais faut l'indiquer dans le bootstrap, par exemple :

    dans application/ créer un dossier library/My avec dedans :
    PluginAuth.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class My_PluginAuth extends Zend_Controller_Plugin_Abstract {
    ...blabla bla on verifie les droits de l'utilisateur ... redirections... interdictions ...
    }
    puis dans le bootstrap (html/index.php) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $acl = new My_ACL ( );           //../library/My/ACL.php c'est automagique
    $auth = Zend_Auth::getInstance ();
    ...
    $controller = Zend_Controller_Front::getInstance ();
    ...
    /*
     *  la gestion auth+acl est assurée par ../library/My/PluginAuth.php
     */
    $controller->registerPlugin ( new My_PluginAuth ( $auth, $acl ) );

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    Je reformule simplement la question, puisque finalement j'ai besoin de ne connaitre qu'un détail.

    Comment fonctionne exactement Zend_Auth quand on stocke les roles en BDD ?

    C'est à dire une structure du type :



    Donc si j'ai bien pigé le truc, je vais créer une classe dérivant de Zend_Acl qui créée en automatique les rôles, les ressources et les droits à partir de la base de données.

    Ensuite j'authentifie l'utilisateur grâce à un formulaire géré par un AuthController qui utilisera "Zend_Auth_Adapter_DbTable".

    Et donc ma question, comment fait Zend_Auth pour connaitre le role de l'utilisateur connecté ? sachant que dans la table user utilisée avec Zend_Auth je ne stocke que le role_id qui correspond à un role_name de la table acl_role utilisée lors de la création des rôles dans ma classe Zend_Acl...

    Qui peut m'éclairer, il me manque un truc à saisir pour que tout s'illumine

    Merci,

    Benjamin.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    @fterrasson :

    Salut, merci pour ta réponse.

    Entre temps j'ai modifié mon arbo pour faire :

    /application
    --/config
    --/controllers
    --/models
    --/MyLib
    ----/Plugin
    --/views
    ----/helpers
    ----/layouts
    ----/scripts
    /html

    J'ai rajouté à mon include_path : /application/
    et je fais un Zend_Loader::loadClass('MyLib_Plugin_Auth'); qui, comme je respecte la convention, reconstruit automatiquement le chemin.

    Est-ce que cette méthode est valable ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Oui on peut ranger ses libs comme on le souhaite.
    Concernant le role_id => role_name, ce n'est peut etre pas elegant on peut aller lire acl_role.

    dans le plugin :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
       public function __construct(Zend_Auth $auth, Zend_Acl $acl)
        {
         	// $auth et $acl sont initialisés dans le boostrap
        	$this->_auth = $auth;
            $this->_acl = $acl;
     
            $this->roles = new aclRole();       
     
            $this->visiteur = 'guest';  // par defaut jusqu'a preuve du contraire
        }
     
        /**
         * Est appelé en PreDispatch et décide pour chaque page visitée si l'utilisateur est identifié et respecte les ACL
         *
         * @param Zend_Controller_Request_Abstract $request
         */
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            //-- Utilisateur Est identifié ? Par défaut c'est un visiteur
            if ($this->_auth->hasIdentity()) 
            {
                $identity = $this->_auth->getIdentity();                      
                $id_role = $identity->id_role;
    // getRoleByID() est défini dans le modele aclRole
                $role = $this->roles->getRoleByID($id_role);   
     
            } else {
               $role = $this->visiteur;		// $role = 'guest';
            }
    ....
    if ( !$this->_acl->isAllowed( $role, $resource, $privilege ))
            {
                //-- Si l'utilisateur n'est pas identifié, on le redirige vers la page de connexion
     
    ....
    On peut aussi définir par id directement dans les ACL.

    J'ai pas creusé la question mais il a des exemples dans le laboratory :
    svn co http://framework.zend.com/svn/framework/laboratory
    dans "Zend_Acl + MVC"

    Il y a aussi l'histoire des heritages de roles aussi, c'est a prendre en compte amha dans le schema de bdd, 'member' hérite de tous les droits de 'guest' + d'autres droits...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    Alors, si je pige bien, Zend_Acl est surtout util quand on ne gère pas les privilèges dans une BDD, mais directement dans PHP alors ?

    Sinon plus simplement, ce n'est pas ce que je vais faire, mais admettons que je ne gère pas les privilèges dans la BDD, admettons que j'ai simplement une table "user" dans laquelle je stocke le rôle.

    Que dois-je stocker dans cette table ? un string du genre 'member' ou 'admin' ? et comment Zend_Auth récupère ce role dans la table, sachant qu'on utilise "Zend_Auth_Adapter_DbTable" ? Je ne comprend pas bien l'automatisme en fait, comment sait-on qu'elle type d'utilisateur est connecté ?

    Si mon champ s'appelle role_name par ex. ce serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->_auth->getIdentity()->role_name;
    C'est bien ça ?

    Je rate un truc là, j'en suis conscient, il me manque un déclic...

    Merci.

    Benjamin.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Par défaut sm
    Bonjour,
    Desolé de ré-ouvrir la discutions, si quelqu'un peut m'aider je travail sur deux tables Personne_table et Role_table, j'aimerais récupéré mon role sur role_table.
    donc je fais comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
           public function preDispatch(Zend_Controller_Request_Abstract $request)	{
    		// is the user authenticated
    		if ($this->_auth->hasIdentity()) {
    		  // yes ! we get his role
    			// $user = $this->_auth->getStorage()->read() ;
    			$rol= new Role();
    			$select = 'select ROLE from role where NUMROLE = '.$this->_auth->getIdentity()->NUMROLE;
    			$role = $rol->fetchRow($sql);
    		} else {
    		  // no = guest user
    		  $role = 'invite';
    		}
    mais ca ne donne rien, quelqu'un peut m'éclaire, Merci.

Discussions similaires

  1. exemple simple de css
    Par rasleboldesid dans le forum Mise en page CSS
    Réponses: 26
    Dernier message: 23/08/2006, 18h44
  2. Réponses: 5
    Dernier message: 21/07/2006, 08h25
  3. [RMI] Exemple simple de mise en place
    Par Marc90 dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 31/05/2006, 16h17
  4. [Framework] Recherche d'exemple simple
    Par anaon dans le forum Spring
    Réponses: 4
    Dernier message: 26/04/2006, 16h08
  5. recherche exemple simple pour corba en c++
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 11h29

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