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 :

Couplé Zend_Acl et Zend_Navigation


Sujet :

Zend_Acl & Zend_Auth PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Par défaut Couplé Zend_Acl et Zend_Navigation
    Bonjour à tous j'essaie de coupler Zend_Acl avec Zend_Navigation afin que mes éléments de menu disparaissent si un utilisateur n'a pas le droit d'accès. Après plusieurs testes les éléments du menu restent toujours apparent ... Par contre si je clique dessus et que je n'ai pas l'authorisation d'y accéder et je suis bien rediriger vers la page souhaitée (Mes acl fonctionnent mais pas le couplage avec zend_navigation) !

    Je poste les classes concernées, si quelqu'un peut regarder pour me donner son avis ça m'aiderait beaucoup !

    Pour info sur l'architecture j'ai déployé mon projet Zend avec Zend_Tool.

    Voilà le fichier de config du menu :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?xml version="1.0" encoding="UTF-8"?>
    	<configdata>
    		<nav>
    			<Whoareus>
    				<label>Who are us</label>
    				<controller>Whoareus</controller>
    				<action>index</action>
    				<ressource>Whoareus</ressource>
    			</Whoareus>
    			<Auth>
    				<label>Connection</label>
    				<controller>Auth</controller>
    				<action>index</action>
    				<ressource>Auth</ressource>
    			</Auth>
    			<Howitswork>
    				<label>How it's work</label>
    				<controller>Howitswork</controller>
    				<action>index</action>
    				<ressource>Howitswork</ressource>
    			</Howitswork>
    			<Howfindkellook>
    				<label>How find kellook</label>
    				<controller>Howfindkellook</controller>
    				<action>index</action>
    				<ressource>Howfindkellook</ressource>
    			</Howfindkellook>
    			<Ourpartners>
    				<label>Our partners</label>
    				<controller>Ourpartners</controller>
    				<action>index</action>
    				<ressource>Ourpartners</ressource>
    			</Ourpartners>
    			<Cgv>
    				<label>CGV</label>
    				<controller>Cgv</controller>
    				<action>index</action>
    				<ressource>Cgv</ressource>
    			</Cgv>
    			<Customersservices>
    				<label>Customers services</label>
    				<controller>Customersservices</controller>
    				<action>index</action>
    				<ressource>Customersservices</ressource>
    			</Customersservices>
    			<Security>
    				<label>Security</label>
    				<controller>Security</controller>
    				<action>index</action>
    				<ressource>Security</ressource>
    			</Security>
    			<Contact>
    				<label>Contact</label>
    				<controller>Contact</controller>
    				<action>index</action>
    				<ressource>Contact</ressource>
    			</Contact>
    			<Blog>
    				<label>Blog</label>
    				<controller>Blog</controller>
    				<action>index</action>
    				<ressource>Blog</ressource>
    			</Blog>
    			<Press>
    				<label>Press</label>
    				<controller>Press</controller>
    				<action>index</action>
    				<ressource>Press</ressource>
    			</Press>
    		</nav>
    	</configdata>
    Le fichier de config des acl :

    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
    [roles]
     
    Guest = null
    User = null
     
    [ressources]
     
    index = null
    auth = null
    Whoareus = null
    Howitswork = null
    Howfindkellook = null
    Ourpartners = null
    Cgv = null
    Customersservices = null
    Security = null
    Contact = null
    Blog = null
    Press = null
     
    [Guest]
     
    allow.index = null
    allow.auth = null
    allow.Whoareus = null
    deny.Howitswork = null
    allow.Howfindkellook = null
    allow.Ourpartners = null
    allow.Cgv = null
    allow.Customersservices = null
    allow.Security = null
    allow.Contact = null
    allow.Blog = null
    allow.Press = null
     
    [User]
     
    allow.index = null
    allow.auth = null
    allow.Whoareus = null
    allow.Howitswork = null
    allow.Howfindkellook = null
    allow.Ourpartners = null
    allow.Cgv = null
    allow.Customersservices = null
    allow.Security = null
    allow.Contact = null
    allow.Blog = null
    allow.Press = null
    le bootstrap :

    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
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
     
    	private $_acl = null;
    	private $_auth = null;
    	private $_role = null;
     
        protected function _initAutoload()
    	{
     
            new Zend_Application_Module_Autoloader(array(
                    'namespace' => '',
                    'basePath'  => APPLICATION_PATH,
            ));
     
            $this->_acl = new Sheraf_Acl(APPLICATION_PATH . '/configs/acl.ini');
            $this->_auth = Zend_Auth::getInstance();
     
            if ($this->_auth->hasIdentity()) $this->_role = $this->_auth->getStorage()->read()->role;
            else $this->_role = 'Guest';
     
    	}
     
    	protected function _initAcl()
    	{
     
    		$front = Zend_Controller_Front::getInstance();
    		$front->registerPlugin(new Sheraf_Controller_Plugin_Auth($this->_acl, $this->_auth));
     
    	}
     
    	protected function _initNavigation()	
    	{
     
    		$view = $this->bootstrap('layout')->getResource('layout')->getView();
    		$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
    		$view->navigation(new Zend_Navigation($config))->setAcl($this->_acl)->setRole($this->_role);
     
    	}
     
    }
    La classe de création des rôles et des ressources depuis le fichier de config des acl :

    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
    57
    58
    59
    class Sheraf_Acl extends Zend_Acl 
    {
    	public function __construct($file)	{
    		$roles = new Zend_Config_Ini($file, 'roles') ;
    		$this->_setRoles($roles) ;
     
    		$ressources = new Zend_Config_Ini($file, 'ressources') ;
    		$this->_setRessources($ressources) ;
     
    		foreach ($roles->toArray() as $role => $parents)	{
    			$privileges = new Zend_Config_Ini($file, $role) ;
    			$this->_setPrivileges($role, $privileges) ;
    		}
    	}
     
    	protected function _setRoles($roles)	{
    		foreach ($roles as $role => $parents)	{
    			if (empty($parents))	{
    				$parents = null ;
    			} else {
    				$parents = explode(',', $parents) ;
    			}
     
    			$this->addRole(new Zend_Acl_Role($role), $parents);
    		}
     
    		return $this ;
    	}
     
    	protected function _setRessources($ressources)	{
    		foreach ($ressources as $ressource => $parents)	{
    			if (empty($parents))	{
    				$parents = null ;
    			} else {
    				$parents = explode(',', $parents) ;
    			}
     
    			$this->add(new Zend_Acl_Resource($ressource), $parents);
    		}
     
    		return $this ;
    	}
     
    	protected function _setPrivileges($role, $privileges)	{
    		foreach ($privileges as $do => $ressources)	{
    			foreach ($ressources as $ressource => $actions)	{
    				if (empty($actions))	{
    					$actions = null ;
    				} else {
    					$actions = explode(',', $actions) ;
    				}
     
    				$this->{$do}($role, $ressource, $actions);
    			}
    		}
     
    		return $this ;
    	}
    }
    et la classe d'authentification :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    class Sheraf_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract	{
    	/**
    	 * @var Zend_Auth instance 
    	 */
    	private $_auth;
     
    	/**
    	 * @var Zend_Acl instance 
    	 */
    	private $_acl;
     
    	/**
    	 * Chemin de redirection lors de l'échec d'authentification
    	 */
    	const FAIL_AUTH_MODULE     = 'login';
    	const FAIL_AUTH_ACTION     = 'login';
    	const FAIL_AUTH_CONTROLLER = 'auth';
     
    	/**
    	 * Chemin de redirection lors de l'échec de contrôle des privilèges
    	 */
    	const FAIL_ACL_MODULE     = 'login';
    	const FAIL_ACL_ACTION     = 'login';
    	const FAIL_ACL_CONTROLLER = 'auth';
     
    	/**
    	 * Constructeur
    	 */
    	public function __construct(Zend_Acl $acl, Zend_Auth $auth)	{
    		$this->_acl  = $acl ;
    		$this->_auth = $auth ;
    	}
     
    	/**
    	 * Vérifie les autorisations
    	 * Utilise _request et _response hérités et injectés par le FC
    	 */
    	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();
    		  $role = $user->role;
    		} else {
    		  // no = guest user
    		  $role = 'Guest';
    		}
     
    		$module 	= $request->getModuleName() ;
    		$controller = $request->getControllerName() ;
    		$action     = $request->getActionName() ;
     
    		$front = Zend_Controller_Front::getInstance() ;
    		$default = $front->getDefaultModule() ;
     
    		// compose le nom de la ressource
    		if ($module == $default)	{
    			$resource = $controller ;
    		} else {
    			$resource = $module.'_'.$controller ;
    		}
     
    		// est-ce que la ressource existe ?
    		if (!$this->_acl->has($resource)) {
    		  $resource = null;
    		}
     
    		// contrôle si l'utilisateur est autorisé
    		if (!$this->_acl->isAllowed($role, $resource, $action)) {
    			// l'utilisateur n'est pas autorisé à  accéder à  cette ressource
    			// on va le rediriger
    			if (!$this->_auth->hasIdentity()) {
    				// il n'est pas identifié -> module de login
    				$module = self::FAIL_AUTH_MODULE ;
    				$controller = self::FAIL_AUTH_CONTROLLER ;
    				$action = self::FAIL_AUTH_ACTION ;
    			} else {
    				// il est identifié -> error de privilèges
    				$module = self::FAIL_ACL_MODULE ;
    				$controller = self::FAIL_ACL_CONTROLLER ;
    				$action = self::FAIL_ACL_ACTION ;
    			}
    		}
     
    		$request->setModuleName($module) ;
    		$request->setControllerName($controller) ;
    		$request->setActionName($action) ;
    	}
    }

  2. #2
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Salut

    Dans ton xml tu as mis la ressource mais tu n'a pas mis le privilège.
    C'est normal?

  3. #3
    Membre confirmé Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Par défaut
    Salut,

    Ok c'est une bonne piste !

    J'ai indiquer pour chaque page de mon fichier navigation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <privilege>index</privilege>
    Maintenant, avec le rôle User et Guest tous mon menu disparait alors que dans mon fichier de config ACL il est indiqué qu'il devraient tous vois ...

  4. #4
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Ben, visiblement dans ta façon de gérer les acls, tu considère que le controlleur constitue ta ressource et que l'action constitue le privilège.
    Donc tu doit préciser ton action comme privilège:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Whoareus>
                    <label>Who are us</label>
                    <controller>whoareus</controller>
                    <action>index</action>
                    <resource>whoareus</resource>
                                    <privilege>index</privilege>
                </Whoareus>
    EDIT: De plus tu ecrit mal ressource tu met un 's' en trop, voit le xml

  5. #5
    Membre confirmé Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Par défaut
    Comment bien galérer pendant trois heures .... C'était le s de trop à resource qui plantait tout.


    Merci pour ce coup d'oeil avisé !

Discussions similaires

  1. [ZF 1.8] Zend_Navigation avec Zend_ACL
    Par guiyomh dans le forum Zend_Acl & Zend_Auth
    Réponses: 5
    Dernier message: 11/08/2009, 19h28
  2. tableau de couple d'entiers
    Par doublelune dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 18/10/2005, 06h34
  3. [mysql]SELECTION couple distinct
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/10/2005, 09h32
  4. [JList] notion de clé, couple clé - valeur affichée
    Par guipom dans le forum Composants
    Réponses: 2
    Dernier message: 26/03/2005, 01h00

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