Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-08-2007 02:03:38

nadia2507
Membre
Date d'inscription: 03-08-2007
Messages: 27

[Zend_Acl]gerer les droit d'accés

bonsoir tt le monde

j'ai une application avec différent niveau d'accés: consultant, editeur, et admin

je crois que je dois utliser zend_acl,

je cherche un tutoriel pour zend_acl pour savoir d'où commencé
et je veux savoir si zend_auth ne peut pas faire l'affaire??

merci d'avance

Hors ligne

 

#2 12-08-2007 10:40:00

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

Re: [Zend_Acl]gerer les droit d'accés

Bonjour,

J'ai fait un tuto : http://www.kitpages.fr/zf_zendAcl.php
C'est une introduction très courte sur les Acl, ça va pas très loin, mais ça explique déjà le principe.

Philippe


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

Hors ligne

 

#3 12-08-2007 10:43:31

nadia2507
Membre
Date d'inscription: 03-08-2007
Messages: 27

Re: [Zend_Acl]gerer les droit d'accés

je l'ai vu, mais mon problème c'est que je ne sais pas est ce je dois créér une classe qui derive zend_acl ou non et ou est ce que je dois la mettre par rapport à l'architectute mvc,

donc en fait je veux savoir quls sont les fichier que je dois créér et où les mettre

merci

Hors ligne

 

#4 15-08-2007 14:48:28

verboz
Membre
Lieu: France, Lille
Date d'inscription: 26-06-2007
Messages: 24
Site web

Re: [Zend_Acl]gerer les droit d'accés

Salut nadia,
bon voilà ce que je fais, j'instancie dans mon bootstrap:
////
// Definition des roles, ressources et des droits d'acces
////
// creer le moteur d'ACL
Zend_Loader::loadClass("Zend_Acl");
Zend_Loader::loadClass("Zend_Acl_Role");
Zend_Loader::loadClass("Zend_Acl_Resource");


// creer le moteur d'ACL
$acl = new Zend_Acl();

// creation de roles "groupes"
$user = new Zend_Acl_Role("USER");
$acl->addRole($user);

$resourceCompte = new Zend_Acl_Resource("compte");
//..Ajouter d'autre ressource
$acl->add($resourceCompte);

Zend_Registry::set("ACL",$acl);//je l'enregistre dans le registre
//////////////fin code dans le index.php
Ensuite j'accède où je veux grâce à:
Zend_Registry::get('ACL')->allow("USER","compte","list");

Et pour vérifier que l'utilisateur a le droit:

if(Zend_Registry::get('ACL')->isAllowed('USER','compte','list')){
//Il possède le droit d'y accéder
}
else
{
//Redirection vers une page d'erreur
}

Hors ligne

 

#5 15-08-2007 22:08:58

nadia2507
Membre
Date d'inscription: 03-08-2007
Messages: 27

Re: [Zend_Acl]gerer les droit d'accés

merci infiniment pour ta reponse

Hors ligne

 

#6 09-10-2007 14:43:21

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: [Zend_Acl]gerer les droit d'accés

Est ce qu'il est possible d'aller plus loin avec zend_acl et faire une verification sur le role du groupe auquel appartiens un utilisateur mais aussi sur l'utilisateur lui même.
Je m'explique le user toto faire partie du groupe membre.
Le groupe membre est autorisé à utiliser UPDATE de la ressource NEWS.
Mais il est autorisé à modifier que ses propre news.
Comment gerez cela ? Zend_Acl peut il le traiter facielement ?

Actuellement je n'utilises pas Zend_Acl pour la gestion des droits et role mais j'aimerais l'intégrer. Pour cela il faut absolument qu'il gère ce genre de contrôle.

Hors ligne

 

#7 09-10-2007 15:18:38

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

Re: [Zend_Acl]gerer les droit d'accés

Bonjour Isilgawen,

J'ai un site qui utilise ce genre de contrôle (pas encore en prod) avec 3 niveaux de droits (chez toi il y en a 2).

J'ai un plugin qui définit puis vérifie les droits.
Prenons un exemple avec :
- 2 niveaux de profils : le profil global et le profil à l'intérieur du groupe
- 2 fonctions : modifier mon compte (module member, controller account)  et le forum du groupe 12 (module message, controller forum)

1) je définis mes droits :
les rôles sont :
- globalVisitor
- globalMember
- globalAdmin
et
- groupVisitor
- groupMember
- groupAdmin

allow("globalMember","member", "account/index")

allow("groupMember", "message", "forum/read")

2) ensuite je teste mes droits :
je récupère le profil du member dans le groupe 12 (donc je sais si c'est un groupVisitor ou un groupMember).
Je fais ensuite les opérations suivantes dans cet ordre :

Code:

if (isAllowed([i]globalProfile[/i], $request->getModuleName(), $request->getControllerName()."/".$request->getActionName()) {
  // accès accepté on ignore la fin du traitement
}

if (isAllowed([i]groupProfile[/i], $request->getModuleName(), $request->getControllerName()."/".$request->getActionName()) {
   // accès accepté, on ignore la fin du traitement
}

// accès refusé

(c'est pas du vrai code, c'est pour donner l'idée...)

Je sais pas si mon explication est claire, mais ça marche bien smile

A+, Philippe


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

Hors ligne

 

#8 10-10-2007 09:22:39

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: [Zend_Acl]gerer les droit d'accés

Hum je suis pas sur d'avoir tout pigé. Mon interrogation porte vraiment sur le fait de pouvoir faire un contrôle sur les droits de l'utilisateur lui même. Exemple avec un blog et la modification de billet :

Controller : blog
Action : updateAction (recupere info du post et modifi le billet)
Route : blog/edit/:idBillet

Même si je fait un allow("member", "blog", "update"), deny("guest","blog","update") je me trouve confronter au fait que n'importe quel membre loggé pourra modifier le billet de quelqu'un d'autre en balancant un post sur un id d'un billet qui lui appartiens pas.

A l'heure actuel j'ai une class qui verifie que la personne loggé modifi que ses propre données mais je pensais pouvoir utiliser acl pour ca mais j'ai pas l'impression que ce soit possible, dommage.

Dernière modification par Isilgawen (10-10-2007 09:24:05)

Hors ligne

 

#9 10-10-2007 09:38:52

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

Re: [Zend_Acl]gerer les droit d'accés

Ok, j'avais compris le problème de travers...

Donc si, c'est possible avec les ACL, regarde du coté des Assertions :
http://framework.zend.com/manual/en/zen … assertions

A l'arrivée tu codes ton test à la mano quand même, mais ça reste localisé au même niveau que les ACL. C'est assez pratique pour mettre tes isAllowed dans un plungin

A+, Philippe


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

Hors ligne

 

#10 10-10-2007 09:56:39

Isilgawen
Membre
Lieu: Limoges
Date d'inscription: 23-03-2007
Messages: 106

Re: [Zend_Acl]gerer les droit d'accés

Perfect philippe c'est exactement ce que je voulais, apparement c'est possible et ca me permettra de localiser tous les controles de roles via acl ce qui est plus propre smile impec, merci.

Hors ligne

 

#11 23-10-2007 11:41:36

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

Re: [Zend_Acl]gerer les droit d'accés

Et moi et moi j'ai pas compris!

J'ai besoin du même système pour un site d'annonce, et je voudrais qu'un utilisateur puisse modifier ses annonces uniquement.
Je voudrais en plus (je suis chiant hein?) avoir des options lors des aperçus des annonces. Je m'explique.
Tout comme dans un forum quand un utilisateur consulte un topic, il peut Signaler | Citer un message. Et quand c'est le sien, il peut Signaler | Citer | Modifier | Supprimer (comme sur ce forum quoi smile ).

J'ai regardé les assertions mais je ne vois pas trop comment m'y prendre pour tester sur un utilisateur ($auth :-p ) peut modifier un ressource (et pas un type de ressource).

Une piste ou un p'tit bout de code? big_smile
N'importe quoi pourvu que mon cerveau puisse avancer à nouveau!

Dernière modification par Mr.MoOx (23-10-2007 17:12:56)

Hors ligne

 

#12 09-11-2007 12:17:49

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

Re: [Zend_Acl]gerer les droit d'accés

up?

Hors ligne

 

#13 11-09-2008 11:11:31

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [Zend_Acl]gerer les droit d'accés

Bonjour à tous,

ok je déterre un post "vieux comme le monde" mais j'ai besoin de vos lumières sur les assertions. J'ai regardé à peu près tout les posts sur le forum et je ne trouve pas de réponse concrète.

J'ai une application qui gère 2 niveaux d'utilisateurs, les admins et les clients. J'ai mis en place un plugin auth (celui que tout le monde connait) et j'ai un fichier MyAcl.php,d ans mon répertoire /application/, qui est instancié dans le bootstrap.

Code:

class MyAcl extends Zend_Acl
{
    public function __construct(Zend_Auth $auth)
    {
        // Les rôles
        $this->addRole(new Zend_Acl_Role('guest')); 
        $this->addRole(new Zend_Acl_Role('client'), 'guest');
        $this->addRole(new Zend_Acl_Role('admin'), 'guest');
        
        // Les ressources
        $this->add(new Zend_Acl_Resource('index'));
        $this->add(new Zend_Acl_Resource('auth'));
        $this->add(new Zend_Acl_Resource('register'));
        
        $this->add(new Zend_Acl_Resource('manager'));
        $this->add(new Zend_Acl_Resource('manager_index'));
        $this->add(new Zend_Acl_Resource('manager_clients'));
        $this->add(new Zend_Acl_Resource('manager_auth'));

        // Les autorisations
        $this->allow('guest', 'index');
    $this->allow('guest', 'register');
    $this->allow('guest', 'manager_auth');
        
        $this->deny('client', 'manager_clients');
        ??? => assertion avec l'id ?, lire la suite :) <= ???
        
        $this->allow('admin'); // Accès sans aucune restriction
    }
}

Tout ça fonctionne correctement car actuellement chaque client peut se loguer et est rediriger vers son espace (un dashboard). Mais il peut aussi changer l'url de type : http://~url~/manager/clients/dashboard/cli_id/10 en modifiant le numéro id pour accéder aux autres espace clients... d'où une grosse faille de sécurité.

Est-ce qe quelqu'un pourrait m'aider à compléter mon code pour sécuriser les espaces ?
Comment coder afin d'utiliser les assertions en récupérant l'id passé en paramètre ?

Merci

Hors ligne

 

#14 11-09-2008 11:17:17

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

Re: [Zend_Acl]gerer les droit d'accés

Perosnnellement quand il s'agit d'infos comme des id clients, je garde ça en session avec Zend_Auth, comme ça je n'ai pas le problème de l'url...
Après y'a d'autres problèmes qui peuvent survenir dans le même genre.
Pour ça faut utiliser les assertions, mais j'ai toujours pas utilisé ça smile

Pour les assertions là méthode la plus simple (simple j'ai dis) c'est de fourrer ce que tu veux dans le registry wink

Hors ligne

 

#15 11-09-2008 11:31:43

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [Zend_Acl]gerer les droit d'accés

Je passe les infos dans l'url car l'admin doit pouvoir gérer les clients.
Par exemple, quand je me logue en tant qu'admin, j'arrive sur la page 'd'accueil admin' avec un tableau qui me liste tout mes clients, en cliquant sur un des clients j'accède à l'accueil de ce client. En comparaison, ça ressemble un peu à l'interface utilisateur de plesk.
A partir de là j'ai plusieurs actions possible je peux modifier le profil, créer des points de vente pour ce clients... et ces actions sont accessibles par des boutons.
url pour modifier un compte client : http://~url~/manager/clients/update/cli_id/9
url pour ajouter un point de vente : http://~url~/manager/agences/add/cli_id/9

Je ne connais que cette solution pour accéder aux informations de la DB.

Par contre si je me logue en tant que client, le numéro id est enregistré en session avec Zend_Auth comme ce que tu fais mais les liens ne change pas et affichent toujours http://~url~/manager/clients/update/cli_id/9, par exemple.

C'est pourquoi je pense que les assertions me seront indispensable, non ?

Hors ligne

 

#16 11-09-2008 11:40:30

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

Re: [Zend_Acl]gerer les droit d'accés

oui, tu devras passer par les assertions, dès que tu as un paramètre dynamique qui a une influence sur les droits, tu ne peux pas y couper.
L'exemple de la doc est assez parlant, c'est pas très compliqué à mettre en place.

A+, Philippe


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

Hors ligne

 

#17 11-09-2008 11:46:01

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [Zend_Acl]gerer les droit d'accés

Disons ce qui est, je suis super nul en programmation tongue Et dans ma classe MyAcl  je ne sais pas comment faire intervenir l'objet de requête. je pense que c'est quelquechose comme

Code:

public function preDispatch(Zend_Controller_Request_Abstract $request) {
        $this->allow("client","manager_clients",null,
            new Pi_Acl_ClientAssert($request->getParam("cli_id",null)));
            // echo $request->getParam("cli_id",null);
}

ou directement dans le constructeur ?
Zend_Controller_Request_Abstract n'est pas définie au bon endroit apparemment smile

Dernière modification par Roulio (11-09-2008 11:48:31)

Hors ligne

 

#18 11-09-2008 13:05:49

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Zend_Acl]gerer les droit d'accés

Hello,

Tu mélanges plugin (preDispatch) et ACL :

Code:

class Controller_Plugin_Acl extends extends Zend_Controller_Plugin_Abstract
{

    public function dispatchLoopStartup (Zend_Controller_Request_Abstract $request)
    {
        $acl = new My_Acl();
        if ($acl->allow("client","manager_clients",null,
            new Pi_Acl_ClientAssert($request->getParam("cli_id",null)))) {
            echo $request->getParam("cli_id",null);
        }
    }
}

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#19 11-09-2008 13:07:13

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

Re: [Zend_Acl]gerer les droit d'accés

Peut être qu'il ne s'embrouille pas big_smile

La requete n'est défini que pendant le dispatching à un certain moment.
Il te suffit de faire dans ton bootstrap - avant l'appel de ta méthode quoi (tout betement roll ) :

Code:

$frontController->setRequest(new Zend_Controller_Request_Http());

Sinon à propos des urls, j'ai une logique similaire su rmon projet actuel et en fait je ne passe l'id que si ce n'est pas "moi" au sens de l'application.
Du coup dans mon action je fais un truc du genre

Code:

if ($this->_hasParam('userId)) {
    $theUser = $model->users->get($this->_getParam('userId));
} else {
    $theUser = $model->user; //l'user en cours
}
//apres je bosse tranquillement avec mon object $theUser

Hors ligne

 

#20 11-09-2008 14:02:00

Roulio
Membre
Lieu: Alsace
Date d'inscription: 20-11-2007
Messages: 137
Site web

Re: [Zend_Acl]gerer les droit d'accés

merci à vous 3, je vais essayer avec les éléments que vous m'avez donné.

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