Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
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
Hors ligne
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
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
merci infiniment pour ta reponse
Hors ligne
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
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 :
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
A+, Philippe
Hors ligne
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
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
Hors ligne
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 impec, merci.
Hors ligne
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 ).
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?
N'importe quoi pourvu que mon cerveau puisse avancer à nouveau!
Dernière modification par Mr.MoOx (23-10-2007 17:12:56)
Hors ligne
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.
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
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
Pour les assertions là méthode la plus simple (simple j'ai dis) c'est de fourrer ce que tu veux dans le registry
Hors ligne
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
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
Hors ligne
Disons ce qui est, je suis super nul en programmation Et dans ma classe MyAcl je ne sais pas comment faire intervenir l'objet de requête. je pense que c'est quelquechose comme
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
Dernière modification par Roulio (11-09-2008 11:48:31)
Hors ligne
Hello,
Tu mélanges plugin (preDispatch) et ACL :
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+
Hors ligne
Peut être qu'il ne s'embrouille pas
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 ) :
$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
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