Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Acl & Zend_Auth
Zend_Acl & Zend_Auth Forum d'entraide pour les composants Zend_Acl & Zend_Auth du Zend Framework (contrôle d'accès, gestion des droits, authentification, etc.). Avant de poster -> Cours Zend_Acl et Zend_Auth.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2008, 16h44   #1
Membre du Club
 
Inscription : septembre 2004
Messages : 191
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 191
Points : 54
Points : 54
Par défaut Utilisation de Zend_Acl et Zend_Auth

Bonjour.

Voilà ma question va certainement vous sembler stupide mais il n'y a rien à faire, il doit y avoir un concept que je n'ai absolument pas saisi.

Créer les règles d'accès, tel groupe à accès à tel ou tel ressources ok pas de problème... (d'ailleurs c'est bien ça le malheur tous les tutos sont là dessus).

Mais comment créer un groupe d'utilisateur concrètement?
Comment créer une ressource concrètement ou plutôt dois-je donc étendre mon controller avec "Zend_Acl_Resource_Interface"? Et dans la fonction getResourceId() j'imagine que je dois simplement faire ceci:

public function getResourceId() {
return 'nomDeMaRessource';
}

Ensuite vient le problème de l'identification. Mes utilisateurs sont en DB avec 1 rôle qui leur attribué. Donc oui j'ai un rôle inscrit en DB, mais comment le créer dans le framework?

En fait j'ai compris comment utiliser les objets Zend_Acl et Zend_Auth mais je suis incapable de les instancier et je ne trouve nulle part d'explication 'claire'.

Merci d'avance.
k o D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 11h25   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
Voila bien le souci, tout est toujours basé sur le même exemple et en plus c'est pas simple.

Je vais te montrer comment moi je fais une authentification, ce code je ne l'ai pas créer, mais repris et adapter.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
$db = new LoginDb();//j'instancie ma classe Model
 
 $authAdapter = new Zend_Auth_Adapter_DbTable($db->get_db());//je passe en paramètre la connection à la db                $authAdapter->setTableName('login');//je passe le nom de la table
$authAdapter->setIdentityColumn('log_nom');//le nom de la colonne user
$authAdapter->setCredentialColumn('log_passwd');//le nom de la colonne password
                $authAdapter->setIdentity($formData['log_nom'])->setCredential($formData['log_passwd']);//ici je passe les infos recu d'un formulaire
$auth = Zend_Auth::getInstance();//je crée une instance d'authentification
$resultat = $auth->authenticate($authAdapter);//ici on fais l'équivalent d'un query
 // On essaye d'identifier l'utilisateur avec les informations du formulaire valide
 if ($resultat->isValid()) { // si c'est ok
     $data = $authAdapter->getResultRowObject(null, 'log_passwd');
     $auth->getStorage()->write($data); // on écrit dans le stockage les informations de l'utilisateur
   $this->_redirect('/'); // on redirige vers l'index
}else{
 
//c'est pas bon
}

A partir de là, je peux vérifier si un utilisateur est connecté ou non

Code :
1
2
3
4
5
6
7
 
//si je ne suis pas connecté
 
if (! Zend_Auth::getInstance()->hasIdentity())
{
	$this->_redirect('/');
}
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 11h48   #3
Membre du Club
 
Inscription : septembre 2004
Messages : 191
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 191
Points : 54
Points : 54
Ok merci.

Mais je ne suis pas certain que cela réponde entièrement à ma question. Comment puis-je connaitre le rôle (càd un groupe) de l'utilisateur?
k o D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 11h54   #4
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
Mes rôles sont définis dans la db avec pour nom de colonne log_acl

donc je fais ceci

Code :
1
2
3
4
 
if(Zend_Auth::getInstance()-> getIdentity() -> log_acl =="admin"){
//il est administrateur
}
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 11h59   #5
Membre du Club
 
Inscription : septembre 2004
Messages : 191
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 191
Points : 54
Points : 54
Ok donc en fait tu n'utilises pas le système "standard" on va dire.
Tu ne fais pas les fameux $ressource->allow($user)


Enfin rien de m'empêche de créer ma propre classe de vérification d'accès en fait.
k o D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 12h12   #6
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
Oui, mais là, ce n'est que la vérification de l'user.

Après j'utilise les acl pour savoir qui est qui
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 12h16   #7
Membre du Club
 
Inscription : septembre 2004
Messages : 191
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 191
Points : 54
Points : 54
Citation:
Envoyé par MaitrePylos Voir le message
Oui, mais là, ce n'est que la vérification de l'user.

Après j'utilise les acl pour savoir qui est qui
Ah donc je pense qu'il y a encore autre chose que je n'ai pas saisi ^^
k o D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 13h23   #8
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
Ok,
Alors concrètement pour mes sites j'ai besoin de trois ou quatre statut(admin,organisation,invité.....).

en gros on accès à cette partie du site ou pas.


En dehors de zf je le fais avec des $_session

Code :
1
2
 
if($_SESSION['user']!='admin' || $_SESSION['user']!='organisation')
Avec les acl, je fais presque le même.

Donc je crée des roles identique aux statut qui se retrouve dans ma db, et puis je vérifie qu'ils sont bien isAllowed

en gros dans une de mes apllications, on va avoir les statuts suivants
- innactif
- annuaire
- introduction
- administrateur
- organisation

donc dans ma db chaque user à un de ces statut.

puis je crée ma classe acl

Code :
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 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);
	}
}
A partir de là les avis diverge, on me dit que je dois créer un plugin, mais je t'avoue que je n'ai pas encore saisi toutes les subtilité d'un plugin.

Par contre j'instancie cette classe dans une session au moment du login
en gros ,pour une session avec zf il faut faire ainsi

Code :
1
2
3
4
 
 
$session = new Zend_Session_Namespace('default');
$session->acl = new My_Classe_Acl(Zend_Auth::getInstance()-> getIdentity() -> log_acl)//je lui passe le rôle définis dans ma db, et qui correspond à un des rôle définis dans ajouterRole

ensuite je remplace ceci

Code :
1
2
 
if($_SESSION['user']!='admin' || $_SESSION['user']!='organisation')
par :

Code :
1
2
3
4
5
6
 
$session = new Zend_Session_Namespace('default');
if (!$session->acl->acces('administration'))
{
      $this->_redirect('/error/redirect');
}
et cela réalise ce que je voulais faire, l'idéal est aussi de gérer les session par une classe abstraite pour éviter la redondance de réinstancier la classe session.

Si tu veux ici, on m'explique le principe du plugin
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 13h56   #9
Membre du Club
 
Inscription : septembre 2004
Messages : 191
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 191
Points : 54
Points : 54
Ahahaha ça je peux t'expliquer pour le plugin.

En gros c'est pour éviter de devoir mettre ton code de vérification (ci-dessous) dans tous tes controllers.

Code :
1
2
3
4
5
$session = new Zend_Session_Namespace('default');
if (!$session->acl->acces('administration'))
{
      $this->_redirect('/error/redirect');
}
Tu crées un plugin dans lequel tu redéfinis sa méthode preDispatch() (qui est appelée avant le constructeur du controller).
Dans cette méthode et bien tu mets le code ci-dessus! Et hop plus besoin de vérifier dans tes futurs controller
k o D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 13h59   #10
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
peux tu me mettre un petit exemple.

A nous deux on va y arriver et on fera un tuto
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 14h28   #11
Membre du Club
 
Inscription : septembre 2004
Messages : 191
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 191
Points : 54
Points : 54
Alors tu as une solution énoncée ici par Julien Pauli

Mais en gros c'est assez simple.

Tu crées une classe plugin dans laquelle tu définis la méthode preDispatch()

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class My_Plugin extends Zend_Controller_Plugin_Abstract
{
    /**
     * Constructeur
     * 
     * @param  string $env Execution environment
     * @return void
     */
    public function __construct($env)
    {
        $this->setEnv($env);
    }
public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $this->getResponse()->appendBody("<p>preDispatch() called</p>\n");
    }
Bien entendu ici le preDispatch est un test qui t'affichera donc bien la preuve qu'il passe par là à chaque fois

Ensuite dans ton bootstrap tu dois enregistrer le public:
Code :
1
2
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new My_Plugin());
Voilà
k o D est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h49.


 
 
 
 
Partenaires

Hébergement Web