Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-01-2008 08:12:04

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

ACL : Comment savoir si l'acces d'un controlleur est autorisé

Bonjour,

Je commence avec ZF et la gestion de droit via ACL. J'ai fait un peu le tour des tutorials mais je n'ai pas trouvé comment faire pour que, lorsqu'une personne accède à une page directement par url ou par un lien (/monsite/agenda), comment savoir que cet utilisateur à bien les privilège et selon ses privilèges, afficher ou non certaine option ?

C'est une question dont la réponse sera certainement compliqué mais pour l'instant je suis bloqué à ce niveau.

Merci de vos réponses.

Hors ligne

 

#2 29-01-2008 08:28:54

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Bonjour,

J'avoue que là dessus je n'ai pas trouvé de solution magique.
J'utilise un plugin qui teste les ACL pour savoir si l'internaute a le droit d'accéder à la page ou non.

Par contre, à l'intérieur d'une page, pour savoir si je dois afficher un bouton ou pas (genre un bouton modifier un message ou autre...), j'utilise des fonctions codées à la main.
Au départ, j'étais parti pour utiliser les ACL aussi pour ces boutons là, mais ça demande d'envoyer l'URL du lien au routeur, s'il y a 40 liens à tester, ça veut dire parser 40 URL avec le router, c'était bcp trop long et pénalisant en termes de perf...
Bref, c'est pas hyper propre, mais je me fais mes petites fonctions à la main pour tester ça...

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#3 29-01-2008 09:20:24

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Tu peux me donner le nom de ton plugin svp ? Un lien, une documentation ? Merci

Hors ligne

 

#4 29-01-2008 09:43:58

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Un bon tuto de Julien: http://julien-pauli.developpez.com/tuto … auth-http/
C'est simple et  rapide en mettre en place!

Hors ligne

 

#5 29-01-2008 11:35:03

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Bonjour,

Le principe est proche du tuto de Simon Mundy :

http://devzone.zend.com/node/view/id/1665

tu feras gaffe de remplacer les

Code:

    $controller = $request->controller;
    $action = $request->action;
    $module = $request->module;

par des $request->getControllerName(); & co ... Sinon ça me marche pas avec les versions récentes du ZF.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#6 29-01-2008 12:58:01

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Ouais c'est vrai, en plus ça peut provoquer des boucles infinis en cas de _forward (j'ai eu ce problème smile )

Hors ligne

 

#7 30-01-2008 08:52:08

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

J'ai du mal à suivre le tuto de Simon Mundy. Celui de Julien était clair, et tous les éléments étaient fournies. Il me manque beaucoup d'informations (morceau de code, nom des fichiers à créer et explication) pour que j'arrive à mettre en place ce tutorial (qui se trouve en version française sur le site de developpez.com).

Par exemple :

Code:

// Création du sitemap à partir du .ini en utilisant la structure de l'exemple
$sitemap = new Zend_Config(new Zend_Config_Ini('../application/config/sitemap.ini', 'live'));

Mon fichier sitemap.ini contient quoi concrètement ?

Code:

$front = Zend_Controller_Front::getInstance();
$front->throwExceptions(true);
$front->setRouter($router)
->setDispatcher(new Zend_Controller_ModuleDispatcher())
->registerPlugin(new My_Plugin_Auth($auth, $acl))
->registerPlugin(new My_Plugin_Agreement($auth))
->registerPlugin(new My_Plugin_View($view))
->setControllerDirectory(array('default' => realpath('../application/controllers/default'),
'admin' => realpath('../application/controllers/admin')))
->setParam('auth', $auth)
->setParam('view', $view)
->setParam('config', $config)
->setParam('sitemap', $sitemap)

A quoi ça sert, comment ça marche ???

Bref, c'est galère car je suis vraiment débuttant et ce que je n'ai pas suffisamment de connaissance pour m'inspirer de ce code (même si le fonctionnement général est clair).

Auriez-vous un exemple complet afin de créer une arborescence, et donner accès à certaines personnes ?

Merci

Hors ligne

 

#8 30-01-2008 09:30:15

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Le fichier sitemap.ini n'a rien à voir avec les ACL.

Pour ce qui est du contrôle d'accès si tu as suivi le tuto, tout se joue dans le plugin ACL, le plugin Auth n'ayant pas besoin d'être modifié (sauf pour le bug cité plus haut).

Hors ligne

 

#9 30-01-2008 13:03:42

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Désolé mais je suis encore sur ce point. J'ai compris comment fonctionne les ACL et l'Authentification en me documentant avec la doc officiel. Maintenant je souhaiterai lorsque je créé un utilisateur, l'affecter un rôle, à quel moment je dois réaliser cette opération et comment y procéder ? Je compte utiliser une bd mysql pour stocker les utilisateurs et leur rôle, quelle attribut dois-je stocker dans la bd, dans quel type de champ, comment faire pour récupérer ce rôle ?

Je ne comprends pas ce code, a quoi sert-il ? Encore désolé pour ces questions qui peuvent paraitre très novice.

Code:

class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
private $_auth;
private $_acl;
private $_noauth = array('module' => 'default',
'controller' => 'login',
'action' => 'index');
private $_noacl = array('module' => 'default',
'controller' => 'error',
'action' => 'privileges');
public function __construct($auth, $acl)
{
$this->_auth = $auth;
$this->_acl = $acl;
}
public function preDispatch($request)
{
if ($this->_auth->hasIdentity()) {
$role = $this->_auth->getIdentity()->getUser()->role;
} else {
$role = 'guest';
}
$controller = $request->controller;
$action = $request->action;
$module = $request->module;

A quoi correspond $module ? pfff..dur dur ZF

EDIT Admin: Pour le code c'est [ code ] et pas [ i ] wink

Dernière modification par whitespirit (30-01-2008 13:11:30)

Hors ligne

 

#10 30-01-2008 13:26:39

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Ce plugin (dont tu n'as toujours pas éditer les 3 dernières lignes qui pourrait - comme dit plus haut - provoquer des bugs) sert à dire si oui ou non l'utilisateur à accès à tel ou tel controller/action. Dedans, tu n'as qu'à modifier éventuellment les tableaux _noauth et _noacl si tu n'utilise pas les même structures, sinon tu register juste le plugin.
Ensuite il te faut authentifié ton utilisateur et ça c'est autre chose faut regardé du côté de zend_auth (regarde dans la rubrique "comment débuter?" du site ou tu trouvera des tutos - dans le header) et c'estlorsque l'utilisateur est authentifié que tu lui attribut un role (provenant de la base de données et probablement défini lors de l'inscription) et que tu enregistre ca dans la session (c'est preque automatique avec zend_auth).
J'espère t'avoir éclairer. Recoupe tous les tutos que tu trouves et tu commencera à piger.

Hors ligne

 

#11 31-01-2008 08:32:42

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

J'avance à petit pas et j'ai une exception qui est soulevé :

Code:

Strict Standards: Declaration of MyPlugin_Agreement::preDispatch() should be compatible with that of Zend_Controller_Plugin_Abstract::preDispatch() in C:\wamp\www\mytranspole\application\models\Agrement.php on line 28

Fatal error: Uncaught exception 'Zend_Exception' with message 'File "Agrement.php" was loaded but class "Agrement" was not found in the file' in C:\wamp\www\mytranspole\library\zend\Loader.php:95 Stack trace: #0 C:\wamp\www\mytranspole\application\models\MyAcl.php(37): Zend_Loader::loadClass('Agrement') #1 C:\wamp\www\mytranspole\index.php(56): MyAcl->__construct(Object(Zend_Auth)) #2 {main} thrown in C:\wamp\www\mytranspole\library\zend\Loader.php on line 95

et voici ce que contient mon fichier Agrement.php

Code:

class MyPlugin_Agreement extends Zend_Controller_Plugin_Abstract
{
    private $_auth;
    
    private $_noagreement = array('module'         => 'default',
                                  'controller'     => 'login',
                                  'action'         => 'agreement');

    public function __construct($auth)
    {
        $this->_auth = $auth;
    }

    public function preDispatch($request)
    {
        if ($request->controller != 'logout' && $this->_auth->hasIdentity()) 
        {
            if (!$this->_auth->getIdentity()->getUser()->hasAgreement()) 
            {
                $request->setModuleName($this->_noagreement['module']);
                $request->setControllerName($this->_noagreement['controller']);
                $request->setActionName($this->_noagreement['action']);
            }
        }
    }
}

Y'a t'il une histoire d'incompatibilité ?

EDIT Admin: Je répète mais merci de placer le code entre les balises adéquates [code ] et non [i ]

Hors ligne

 

#12 31-01-2008 09:36:57

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Tu as mal lu ton message d'erreur. Je ne te dirais pas la réponse car elle est écrite dedans.
Lis bien et essaye de comprendre, ton erreur est stupide smile

Hors ligne

 

#13 31-01-2008 09:42:50

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Une petite indication quand même : compare la façon de déclarer les fonctions dans Zend_Controller_Plugin_Abstract et dans ta classe, il devrait manquer quelque chose smile


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#14 31-01-2008 11:09:31

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Hey, je n'ai plus de message d'erreur. Effectivement, il fallait interprété les messages :
1. Le constructeur parent de Zend_Controller_Plugin_Abstract:: preDispatch(Zend_Controller_Request_Abstract $request)
2. Dans le fichier Agrement.php se trouve la classe "MyPlugin_Agreement" et non "Agrement".

Ayant recopié le code sur le site cité plus haut, je n'ai pas su interprété ces erreurs.

Encore une question, est-il possible d'avoir un nom de classe ne portant pas le même nom du fichier correspondant ?

Merci bcp de votre patience, je crois que je n'ai pas choisi le chemin de la facilité de commencer ZF directement sur un gros projet.

Hors ligne

 

#15 31-01-2008 11:20:32

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Oui si vraiment tu y tiens, dans ce cas là il suffit d'utiliser require (plus rapide) plutôt que Zend_Loader::loadClass() (qui elle charge la classe et détermine le fichier où elle se trouve en fonction du nom de la classe formatée)

Je crois que je n'ai pas choisi le chemin de la facilité de commencer ZF directement sur un gros projet.

J'peux rien dire j'ai fait pareille que toi smile et donc j'ai posé pleins de questions tout comme toi wink
Au final j'en suis très content et j'me dis que j'aurais encore plus galéré sans le zf sur ce projet là!

Hors ligne

 

#16 31-01-2008 12:16:15

zendframwork
Membre
Date d'inscription: 12-01-2008
Messages: 49

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

salut  a tous
au faite je suis nouvelle tout comme toi whitespirit et je travaille sur le même projet que toi et tout comme toi  je rencontre pleine de petit problèmes.
au faite je me pers un petit peut dans la répartition des fichiers (ou placer certaines classes,que mettre dans les controllers....).
as tu réussis a faire marcher l'application car pour moi ça bloque.
merci et bon courage

Hors ligne

 

#17 31-01-2008 13:30:47

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

je suis encore loin du compte et j'avance à mon rythme qui n'est pas le plus rapide.

J'ai créé une classe MyAcl héritant de Acl, et un controlleur Index permettant d'ajouter dans une table de ma bd un nouvel utilisateur. Lors de l'ajout de cet utilisateur, j'ajoute son rôle dans un champs de la table. Par exemple j'ai l'utilisateur dans ma table un enregistrement ['paul']['password']['guest'], avec  'guest' correspondant à un rôle défini dans MyAcl. RQ : stocker la chaine de caractère 'guest' dans ma table est bien correct si je veux tester le rôle de cet utilisateur plus tard ?

Je souhaiterai effectuer le test suivant :

Code:

echo $myacl->isAllowed('guest', 'planning') ? 'autorisé' : 'refusé';

Le hic est que $myacl est défini dans le fichier index.php et je n'arrive pas à y acceder depuis le fichier IndexController.php. J'ai essayé de passer par $registry->set('myacl',$acl) mais sans succès. Comment utiliser des variables définis sur plusieurs pages ?

zendframork : je galère énormément. Beaucoup de concept à comprendre et à utiliser en même temps (bootstrap, front, gestion db, plugin, etc.), pour l'instant je suis surtout à la compréhension de la ZF que sur mon projet. Je n'ai pas encore réussi à résoudre l'objet principal de ce post :"ACL, comment savoir si l'accès d'un controlleur est autorisé". Par contre, j'ai réussi à mettre en place le MVC et suivre jusqu'au bout 2 tutorials : "Débutez avec Zend_Auth" et "Débuter avec le Zend
Framework (approche MVC)" (disponible sur "www.developpez.com/". Par contre l'application dont le lien est sur ce post, ça ne fonctionne pas du tout, j'ai laissé tombé. J'essaie de faire un meedley bourrin de tout ce que j'ai compris jusqu'à présent. Bon courage !

PS: je suis preneur si vous avez un source exemple complet d'une petite application...

Dernière modification par whitespirit (31-01-2008 13:37:43)

Hors ligne

 

#18 31-01-2008 13:59:50

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

stocker la chaine de caractère 'guest' dans ma table est bien correct si je veux tester le rôle de cet utilisateur plus tard

Ben pour ce genre de truc, je déconseille forement les chaine de caractère. un simple numéro suffit (1: guest, 2: user, 3: admin ?)
Après tu te fais un pauvre tableaux php avec les correspondance...

Comment utiliser des variables définis sur plusieurs pages ?

Zend_Registry est là pour ça. Tu dois mal l'utiliser. Essaye Zend_Registry::set('myacl',$acl) quand bien sur tu à le $acl à porté.

Hors ligne

 

#19 31-01-2008 14:09:22

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Maintenant je vais chercher pour stoker les infos du connecté dans une session ou autre...

Dernière modification par whitespirit (31-01-2008 14:18:12)

Hors ligne

 

#20 31-01-2008 14:14:54

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Zend_Auth te permet de gérer ça automatiquement (il gère une session exprès entre autres). Ne réinvente pas la roue...

Hors ligne

 

#21 01-02-2008 09:37:15

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

Il y'a qq chose que je ne comprends pas avec les Acl et Auth. J'ai suivi le tuto simple d'authentification (ou il n'y a pas de HTTP_REQUEST). J'interroge une base de données ou je récupère convenablement les infos de ma base de données et le code ressemble à ça :

Code:

                //-- Défini la table User et indique les nom Username et Password que l'on vient de récupérer
                $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();
                
                //-- Test si l'authentification est ok, et sauvegarde automatiquement dans la session
                $result = $auth->authenticate($authAdapter);

                //-- Succès, password valide : on sauvegarde les éléments (sauf le mot de passe) pour pouvoir afficher dans le pied de page par exemple
                if ($result->isValid()) 
                {
                    // success: store database row to auth's storage
                    // system. (on ne sauvegarde pas le mot de passe)
                    $data = $authAdapter->getResultRowObject(null, 'password');
                    $auth->getStorage()->write($data);
                    $this->_redirect('/');
                } 
                else     //-- echec de l'authentification
                {
                    // failure: clear database row from session
                    $this->view->message = 'Login failed.';
                }

Je souhairai sauvegarder d'autres informations et champs de la table User(nom,password,role) dans l'objet auth  dont le rôle. Comment faire pour sauvegarder les infos que je désire ?

Ce que je souhaiterai est d'utiliser la classe class MyPluginAuth extends Zend_Controller_Plugin_Abstract et le concept défini sur le site http://julien-pauli.developpez.com/tuto … modele-MVC (que je n'ai pas réussi à faire fonctionner) en l'adaptant    pour qu'il fonctionne pour ce tuto http://r-benyacoub.developpez.com/tutor … zend-auth/ (qui fonctionne sans pb).

Que dire de plus, merci.

Hors ligne

 

#22 07-02-2008 12:02:24

zendframwork
Membre
Date d'inscription: 12-01-2008
Messages: 49

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

salut a tous
tout comme toi whitespirit je galaire avec Zend_auth et Zend_Acl.j'ai du mal a faire marcher mon application du
tuto http://r-benyacoub.developpez.com/tutor … zend-auth/ (qui fonctionne sans pb) avec
le concept défini sur le site http://julien-pauli.developpez.com/tuto … modele-MVC .
il n'y'aurait pas un éxemple complet qui marche pour voir comment fonctionne l'authentification avec les acl
j'aurai une question:
que signifie cette instruction ?et quand doit-on l'utilisée?
<code>
private $_noacl = array('module' => 'default',
  'controller' => 'error',
  'action' => 'privileges');
</code>
voila merci et bon code

Hors ligne

 

#23 07-02-2008 13:03:10

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: ACL : Comment savoir si l'acces d'un controlleur est autorisé

C'est pourtant simple, il suffit de décoder!
C'est donc une variable privée qui indique la route à prendre (module/controller/action) dans le cas où l'utilisateur n'as pas les droits d'accès (no acl)... C'est donc en gros la page appeller si les droits d'acces ne sont pas suffisant...

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages