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 :

ACL dans une session


Sujet :

Zend_Acl & Zend_Auth PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut ACL dans une session
    Bonjour,

    J'essaye de mettre en place les Acl, pour sécuriser mon application.

    soit la classe suivante :

    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
     
    <?php
    class My_Classe_Acl extends Zend_Acl
    {
    	private $_role ;
     
    	public function __construct ($role)
    	{
    		$this->_role = $role;
    		$this->ajouterRole();
    	}
    	private function ajouterRole ()
    	{
    		$this->addRole(new Zend_Acl_Role('inactif'));
    		$this->addRole(new Zend_Acl_Role('annuaire'));
    		$this->addRole(new Zend_Acl_Role('introduction'), 'annuaire');
    		$this->addRole(new Zend_Acl_Role('administration'), 'introduction');
    		$this->addRole(new Zend_Acl_Role('organisation'), 'administration');
    		$this->allow('inactif', null, 'stop');
    		$this->allow('annuaire', NULL, 'annuaire');
    		$this->allow('introduction', NULL, array(
     
    			'annuaire' , 
    			'introduction'
    		));
    		$this->allow('administration', NULL, array(
     
    			'annuaire' , 
    			'introduction' , 
    			'administration'
    		));
    		$this->allow('organisation');
    	}
     
    	public function acces($access)
    	{
     
    		return $this->isAllowed($this->_role,NULL,$access);
    	}
    }

    Dans ma base de données, chaque utilisateur à un rôle.

    Donc un fois que l'utilisateur se connecte via Auth, j'instancie cette classe et je la met en session

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    My_Session::setData('Acl',new My_Classe_Acl(Zend_Auth::getInstance()-> getIdentity() -> log_acl));
    My_Session est donc une classe qui gére la session.


    je fais donc appel à ses méthodes de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	if (! My_Session::getData('Acl')->acces('administration'))
    		{
    			$this->_redirect('/error/redirect');
    		}
    J'obtient exactement le résultat voulu.

    Mais dans la doc Zend on parle plutôt de sérialiser le méthode, et là je n'y arrive pas.

    Voyer vous, une erreur conceptuelle dans ma façon de faire.

    Merci de votre aide.

    MaitrePylos

  2. #2
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Oulha mais tu t'embêtes pour rien

    Pourquoi ne fais-tu pas un plugin qui vérifie les autorisations ?

    Voilà comment je fais :
    Ma classe ACL, qui gère les ressources et les rôles :
    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
    <?php
     
    class Inuitech_Janitrix_Acl extends Zend_Acl
    {
     
        public function __construct()
        {
     
            $this->add(new Zend_Acl_Resource('index'));
            $this->add(new Zend_Acl_Resource('connexion'));
            $this->add(new Zend_Acl_Resource('inscription'));
            $this->add(new Zend_Acl_Resource('nouvelles'));
            $this->add(new Zend_Acl_Resource('cours'));
            $this->add(new Zend_Acl_Resource('videos'));
            $this->add(new Zend_Acl_Resource('contact'));
            $this->add(new Zend_Acl_Resource('administration'));
     
            $this->addRole(new Zend_Acl_Role('visiteur')); 
            $this->addRole(new Zend_Acl_Role('membre'), 'visiteur');
            $this->addRole(new Zend_Acl_Role('administrateur'));
     
            $this->allow('visiteur');
            $this->deny('visiteur', 'cours', 'commenter');
            $this->deny('visiteur', 'videos', 'commenter');
            $this->deny('visiteur', 'administration');
     
            $this->allow('membre');
            $this->deny('membre', 'administration');
            $this->deny('membre', 'inscription');
     
            $this->allow('administrateur');
     
        }
     
    }
    Puis mon 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    <?php
     
    /**
     * Ce fichier contient la classe Inuitech_Acl_Plugin.
     *
     * @copyright  2008 Gabriel Malkas
     * @license    "New" BSD License
    */
     
    /**
     * Plugin qui vérifie les droits d'accès de la session en cours
     * à la page demandée.
     *
     * @copyright  2008 Gabriel Malkas
     * @license    "New" BSD License
     */
    class Inuitech_Acl_Plugin extends Zend_Controller_Plugin_Abstract
    {
     
        private $_auth = null;
        private $_acl = null;
     
     
        public function __construct($auth, $acl)
        {
            $this->_auth = $auth;
            $this->_acl = $acl;
        }
     
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
     
            $role = 'visiteur';
     
            if ($this->_auth->hasIdentity()) {
                $role = $this->_auth->getIdentity()->role;
            }
     
            $controller = $request->controller;
            $action     = $request->action;
            $module     = $request->module;
            $resource   = $this->_acl->has($controller) ? $controller : null;
     
            if (!$this->_acl->isAllowed($role, $resource, $action)) {
                $request->setControllerName('Error');
                $request->setActionName('deny');
            }
     
        }
     
    }
    Je crée le plugin dans le fichier bootstrap puis l'ajoute au front controller. Ainsi, à chaque fois que l'accès est interdit, l'utilisateur voit l'action 'deny' du contrôleur ErrorController. De plus, ce n'est pas une redirection, donc l'url dans le navigateur reste la même (utile si on veut pas montrer l'url direct du contrôleur d'erreur).

    Après je ne pourrais pas dire si cette façon de faire est mieux que la tienne, mais elle me semble plus cohérente, puisqu'elle utilise pratiquement que de l'existant. De plus, de mon côté, pas besoin de gérer la session, Zend_Auth le fait pour moi.

    Si tu as besoin de plus d'info, n'hésites pas

    Bon courage.

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    OK,
    J'essaye d'assimiler.

    On ne peut entrer dans mes page qui si on est logué, sinon je vais sur un controllerLogin.

    1) est_ce que je peux instancier ce plugin à cette endroit et non pas dans la bootstrap.

    2) comment fais-tu pour empêcher un utilisateur de voir tel ou tel partie du site.

    J'ai un peu de mal à comprendre cette histoire de plugin

    Merci de ton aide

  4. #4
    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
    Créer un Plugin de permet de rédéfinir une des six méthodes qui interviennent avant ou après ton action (et donc sa vue) :

    http://framework.zend.com/manual/fr/...r.plugins.html

    Sur ce diagramme de séquence, on voit que preDispatch intervient avant l'acheminement de ton action (dispatch), dispatchLoopStartup aurait pu aussi être redéfinie (la différence entre les deux est subtile).

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Question bête,

    Si j'ai un controller toto, auquel seul administrateur à accès, comment je le définis.

    Je veux dire, comment dire à ce controlleur que seul ce rôle peut avoir accès.

    c'est juste cet élément que j'arrive pas à comprendre.

    Merci de voter aide.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    Salut MaîtrePylos,

    Dans mon projet, j'utilise Zend_Auth et Zend_Acl.
    Pour stocker les Acls, j'utilise la base de données avec 4 tables :
    1. Roles (id, idParent, name)
    2. Ressources (id, idParent, name)
    3. Actions (id, idRessource, name)
    4. Permissions (id, idRole, idRessource, idAction, isAllowed // boolean)


    Les ressources sont définies comme soit le nom du module tout seul soit nomModule.'_'.nomController.
    Ce qui me permet définir des accès globaux ou très spécifiques.


    Pour loader les permissions, je me suis céer une classe perso Acl qui se load les permissions de la base données à l'instanciation.
    Puis pour l'authentification, j'ai défini un plugin dont voici le code :


    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
    class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract { 
    	private $_auth;
     
        public function __construct($auth) {
            $this->_auth = $auth;
        }
     
        public function routeShutdown(Zend_Controller_Request_Abstract $request) {
            $acl = new My_Acl();
    		$noauth = array('module' => $request->module,
    			'controller' => 'auth',
    			'action' => 'login'
    		);
     
    		$noacl = array('module' => $request->module,
    			'controller' => 'error',
    			'action' => 'privilege'
    		);
     
    		if ($this->_auth->hasIdentity()) {
    			$facade = My_Db_Facade::getInstance();
    			$roles = $facade->getRoles(array('key' => 'id', 'value' => $this->_auth->getIdentity()->idRole));
    			$role = $roles[0]['name'];
    		}
    		else {
    			$role = 'guest'; // Guest role, when not identify
    		}
     
    		$module = $request->module;
    		$controller = $request->controller;
    		$action = $request->action;
    		$resource = $module.'_'.$controller;
     
    		if (!$acl->has($resource)) { // if no resource defined for Module + Controller, checks if there one for the module only
    			$resource = $acl->has($module) ? $module : null;
    		}
     
    		if (!$acl->isAllowed($role, $resource, $action)) {
    			if (!$this->_auth->hasIdentity()) {				
    				$module = $noauth['module'];
    				$controller = $noauth['controller'];
    				$action = $noauth['action'];
    			}
    			else {
    				$module = $noacl['module'];
    				$controller = $noacl['controller'];
    				$action = $noacl['action'];
    			}
    		}
    		$request->setModuleName($module);
    		$request->setControllerName($controller);
    		$request->setActionName($action);
    	}
    }	
    ?>
    Au par avant, j'ai créé l'instance de Zend_Auth dans le bootstrap.php pour le passer au plugin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    $auth = Zend_Auth::getInstance();
    $auth->setStorage(new Zend_Auth_Storage_Session('Auth'));
    ...
    $front->registerPlugin(new My_Plugin_Auth($auth));
    ...
    J'espère que ça peut t'aider.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    J'utilise les classes de Janitrix, mais je ne comprends pas bien ou et quand récupérer le rôle du membre stoqué dans ma bdd.

    merci par avance

  8. #8
    Membre expérimenté Avatar de Alshten
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2005
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 157
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Question bête,

    Si j'ai un controller toto, auquel seul administrateur à accès, comment je le définis.

    Je veux dire, comment dire à ce controlleur que seul ce rôle peut avoir accès.

    c'est juste cet élément que j'arrive pas à comprendre.

    Merci de voter aide.
    Disons qu'en gros le principe est de définir toutes tes permissions au tout début avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $acl->allow('monrole','moncontroleur','monaction');
    ou
    $acl->deny('monrole','moncontroleur','monaction');
    Puis de faire un Plugin avec en preDispatch une fonction faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!$acl->isAllowed('role utilisateur',$this->getRequest()->getControllerName(),$this->getRequest()->getActionName())
    	//pas le droit d'accès, redirection vers un message d'erreur
    else 
    	//vous avez le droit d'accès
    Je sais pas si c'est plus clair, personnellement j'ai mis du temps à comprendre aussi après je pense que les autres ont mis suffisamment d'exemple.

    J'utilise les classes de Janitrix, mais je ne comprends pas bien ou et quand récupérer le rôle du membre stoqué dans ma bdd.

    merci par avance
    En fait le rôle du membre est stocké en session dans un espace de stockage au moment de l'authentification. C'est pour ça que Janitrix fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $role = $this->_auth->getIdentity()->role;
    Pour récupérer le rôle.
    Au moment de l'authentification, il faut faire une ligne du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $auth->getStorage()->write($authAdapter->getResultRowObject(array('id_user', 'login','role')));
    Pour pouvoir récupérer le rôle comme Janitrix.

    Je sais pas si j'ai été clair.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Interbase] Recordset dans une session ?
    Par hxt dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/05/2006, 15h49
  2. Réponses: 3
    Dernier message: 20/05/2006, 23h28
  3. Réponses: 7
    Dernier message: 15/05/2006, 13h36
  4. Entrer dans une session sans devoir cliquer sur ok au demarr
    Par beegees dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 22/12/2005, 10h50
  5. [Sécurité] Variables dans une session
    Par philippef dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2005, 16h30

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