Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-05-2009 16:24:59

gordontesos
Membre
Date d'inscription: 18-03-2009
Messages: 10

[1.8.1][Zend_Acl] Hiérarchie d'autorisations étrange

Bonjour.

Je développe une application qui permet à des utilisateurs enregistrés et abonnés à mon service de pouvoir consulter les produits souscrits dans le cadre de leur abonnement, mais également d'en créer de nouveaux, si leur quota n'est pas atteint.

Concrètement donc, l'accès à l'application cliente est ouverte à tout client possédant un abonnement actif. Mais la possibilité de créer un produit dépend du quota actuel du client. Je pense que les assertions d'ACL sont la meilleure solution pour subvenir à ce besoin.

Cependant, ma déclaration des droits me pose problèmes :

Code:

$acl->allow(Model_User::STATUS_USER, 'client');
        $acl->deny(Model_User::STATUS_USER, 'client', 'addmission');
        $acl->allow(Model_User::STATUS_USER, 'client', 'addmission', new Acl_MissionAssert(Zend_Auth::getInstance()->getIdentity()->id));

Ainsi, dans la théorie, tout utisateur actif (dont le rôle est Model_User::STATUS_USER) peut accéder à l'application cliente, mais le privilège 'addmission' est limité selon le quota. Après vérification manuelle de la fonction d'assertion, celle-ci fonctionne correctement, et renvoie la bonne valeur.
Cependant, lorsque dans l'application, je cherche à vérifier le privilège 'addmission', j'obtiens une autorisation à chaque fois :

Code:

throw new Exception('assert : '.Zend_Registry::get('acl')->isAllowed(Zend_Auth::getInstance()->getIdentity()->status, 'client', 'addmission'));

me renvoie 1, et ce même en forcant le false dans l'assertion.
Toujours dans ce contexte, désactiver la  troisième règle (le allow du 'addmission') interdit l'accès à l'application (alors que mon plugin chargé de vérifier les droits globaux ne spécifie pas de privilège, et se cantonne donc à la ressource).
J'avoue bloquer sur ce problème, je suis relativement novice vis-à-vis du ZF, et je n'ai pas tout à fait cerné le fonctionnement de ce composant.
Mon problème vient probablement de la déclaration des droits, mais j'ai eu beau tester différentes configurations, rien n'a fonctionné.

Je vous remercie par avance de vos éclaircissements.

Dernière modification par gordontesos (27-05-2009 16:25:43)

Hors ligne

 

#2 27-05-2009 21:32:07

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: [1.8.1][Zend_Acl] Hiérarchie d'autorisations étrange

Il me faudrait le code de ta classe d'assertion. Par contre, je ne vois pas pourquoi tu passes en argument dans le constructeur l'ID de l'utilisateur connecté. Tu peux y accéder depuis ta classe puisque c'est une méthode statique.

Hors ligne

 

#3 27-05-2009 21:43:59

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: [1.8.1][Zend_Acl] Hiérarchie d'autorisations étrange

En regardant mieux, c'est normal. Tu fais un deny sur le trio Model_User::STATUS_USER, 'client', 'addmission', puis un allow sur le même groupe rôle-ressource-privilège. A mon avis, ton allow écrase ton deny dans le registre ACL.

Moi je ferais :

Code:

$acl->allow(Model_User::STATUS_USER, 'client', 'addmission', new Acl_MissionAssert(Zend_Auth::getInstance()->getIdentity()->id));
$acl->allow(Model_User::STATUS_USER, 'client', array('autre_privilege1', 'autre_privilege2'));

Hors ligne

 

#4 28-05-2009 14:55:06

gordontesos
Membre
Date d'inscription: 18-03-2009
Messages: 10

Re: [1.8.1][Zend_Acl] Hiérarchie d'autorisations étrange

Bonjour et merci de ta réponse.

Pour ce qui est de la première question, l'ACL n'est pas en soi lié à l'auth : ainsi, on pourrait vouloir tester les autorisations d'un utilisateur donné, et non nécessairement de l'utilisateur connecté. Imaginons par exemple que l'administrateur ait besoin de savoir si tel utilisateur a tel droit : on utilisera l'ACL sur un utilisateur autre que celui stocké par Zend_Auth.

Concernant le problème en lui-même, voilà mon raisonnement initial : en déclarant des droits globaux, puis en spécifiant pour des cas donnés, je pensais obtenir un registre souple : ma première déclaration autorise tous les utilisateurs à accéder à l'application, la deuxième interdit arbitrairement l'accès à 'addmission', tandis que la troisième crée une exception à la seconde, en autorisant, selon l'assertion, l'accès à des utilisateurs spécifiques.
Dans la réalité, étant donné que j'autorise en premier lieu tous les utilisateurs dans la ressource 'client', est-ce que les privilèges ne sont pas tous autorisés par défaut également ? Ou est-ce l'inverse : un "allow($role, $resource)" n'autorise que pour les demandes sans privilège ?

Voici enfin, comme tu l'as demandé, le code de mon assertion : ceci dit, je doute qu'il puisse être en cause :

Code:

<?php

class Acl_MissionAssert implements Zend_Acl_Assert_Interface
{

    private $_id;

    public function assert(Zend_Acl $acl,
                           Zend_Acl_Role_Interface $role = null,
                           Zend_Acl_Resource_Interface $resource = null,
                           $privilege = null)
    {
        //return false;
        $user = new Model_User($this->_id);
        if($user->_subscription->type == Model_Subscription::TYPE_ULTIMATE) return true;
        if($user->curcount < $user->_subscription->type) return false;
        else return true;
    }

    public function __construct($id)
    {
        $this->_id = $id;
        return true;
    }

}

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