Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-01-2010 10:31:28

Devether
Membre
Date d'inscription: 23-01-2009
Messages: 21

[Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

Bonjour,

Mon site nécessite cinq rôles : 'invité', 'lecteur', 'rédacteur', 'modérateur' et 'admin'

l'invité et le lecteur ne peuvent que lire les articles
le rédacteur peut ajouter un article et modifier ses propres articles seulement.
le modérateur valide ou non les articles ajoutés par le rédacteur et peut modifier n'importe quel article.
l'admin... peut tout faire


Pour éditer un article j'ai une action modifierAction() dans ArticlesController.

Jusque là rien de bien nouveau.

Quand 'modérateur' veut modifier un article, pas de problème il a les droits :

$acl->allow('modérateur', 'articles', array('ajouter', 'valider', 'modifier', 'supprimer'));

Si j'ajoute l'action 'modifier' pour le 'rédacteur', il aura les droits pour modifier tous les articles alors il ne peut modifier que les siens.

j'ai tenté de créer une autre action correspondante à la modification de ses créations mais je n'ai pas envi d'écrire une seconde fois modifierAction()

J'aimerais donc savoir quel serait la meilleur approche à avoir dans ce contexte.

Merci d'avance,
Devether

Dernière modification par Devether (29-01-2010 09:36:39)

Hors ligne

 

#2 28-01-2010 11:12:57

yvann
Membre
Date d'inscription: 24-07-2008
Messages: 81

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

Je n'ai pas le temps de répondre plus en profondeur, mais c'est le 4ème paramètre qu'il faut compléter. Tu dois créer ta propre "assertion" et la passer en paramètre de ton allow().

Hors ligne

 

#3 28-01-2010 12:20:20

Devether
Membre
Date d'inscription: 23-01-2009
Messages: 21

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

Merci c'est ce qu'il me fallait.

Cependant, je ne sais pas comment récupérer la request dans assert() pour avoir l'id de l'article qui est en paramètre et ainsi vérifier le créateur.

Dernière modification par Devether (28-01-2010 12:20:56)

Hors ligne

 

#4 28-01-2010 13:54:26

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

Quand tu construis ta classe Assertion, tu peux faire ton propre constructeur et lui passé ce que tu veux en paramètre, après, dans ta fonction assert, tu peux ainsi récupérer les valeurs


----
Gruiiik !

Hors ligne

 

#5 28-01-2010 14:49:32

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

Dans ton cas, je crois qu'il te faudra utilise $_GET dans ton assertion même si ce n'est pas super propre.

Hors ligne

 

#6 28-01-2010 16:24:35

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

3uclide a écrit:

Dans ton cas, je crois qu'il te faudra utilise $_GET dans ton assertion même si ce n'est pas super propre.

nan nan


----
Gruiiik !

Hors ligne

 

#7 28-01-2010 16:40:19

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

Étant donné que l'assertion sera créé avant le dispatching (j'imagine), donc tu n'as pas accès au paramètre de la requête... Que proposes-tu?

Hors ligne

 

#8 28-01-2010 17:07:40

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

Salut,

Attention, une action dans les ACLs n'est pas forcément égale à une action de controleur. C'est bien pratique parce qu'on peut faire un plugin ou un helper qui automatise tout ça, mais c'est souvent contraignant. La logique voudrait que l'article soit la ressource et l'user le role (et donc que ce soit la classe Article qui implémente Zend_Acl_Resource_Interface et non pas le controlleur).

A ce moment là dans l'assertion c'est très simple, il suffit de comparer l'userId de l'article à l'id de l'user connecté.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#9 28-01-2010 17:18:13

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

3uclide a écrit:

Étant donné que l'assertion sera créé avant le dispatching (j'imagine), donc tu n'as pas accès au paramètre de la requête... Que proposes-tu?

Biensur que si les paramètres sont dispo. A partir du moment ou la route est identifiée, les paramètres sont disponible dans l'objet request

EDIT : donc déjà accessible dans routeStartup($request)

Dernière modification par nORKy (28-01-2010 17:20:23)


----
Gruiiik !

Hors ligne

 

#10 29-01-2010 09:35:58

Devether
Membre
Date d'inscription: 23-01-2009
Messages: 21

Re: [Résolu][Zend_Acl][1.9.0] Autoriser l'accès sous conditions

nORKy a écrit:

Biensur que si les paramètres sont dispo. A partir du moment ou la route est identifiée, les paramètres sont disponible dans l'objet request

En effet, ils le sont :

Code:

class My_Acl_Assert_EstCreateurArticle implements Zend_Acl_Assert_Interface
{
    public function assert(Zend_Acl $acl,
                           Zend_Acl_Role_Interface $role = null,
                           Zend_Acl_Resource_Interface $resource = null,
                           $privilege = null)
    {
        return $this->_estCreateur();
    }

    protected function _estCreateur()
    {
        // on récupère l'identité de l'utilisateur connecté
        $auth = Zend_Auth::getInstance();
        $identity = $auth->getIdentity();

        // on récupère le paramètre correspondant à l'id de l'article
        $request = Zend_Controller_Front::getInstance()->getRequest();
        $articleId = $request->getParam('id', null);

        if (null === $articleId) return false;

        $tableArticles = new Articles();
        $articles = $tableArticles->find($articleId);

        if (!$articles->valid())  return false;

        $article = $articles->current();
        if ($article->utilisateur_id == $identity->id)
            return true;
        else
            return false;

    }
}

Et ça marche parfaitement. Merci à tous.

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