Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-11-2008 01:48:50

Sephi-Chan
Membre
Lieu: Yerres (91)
Date d'inscription: 21-01-2008
Messages: 20
Site web

[Zend_Auth][1.6] Un utilisateur ne peut utiliser que ses ressources

Bonsoir, bonsoir !

Ces derniers temps, j'ai pu jouer un peu avec le système d'Acl de Zend Framework. Je trouvais ça très bien jusqu'au drame : je ne parviens pas à automatiser entièrement le faire que l'utilisateur ne peut accéder qu'à ses ressources de manière générale.

Pour situer le contexte, il s'agit d'un jeu par navigateur où un compte joueur dispose de un ou plusieurs personnages. J'ai une fonctionnalité qui permet de lister les personnages, mais je voudrais que l'utilisateur ne puisse accéder qu'aux personnages liés à son compte.

Je signale que j'utilise un plugin dont l'action PreDispatch() vérifie si l'utilisateur (rôle guest si pas authentifié) a accès ou non à ce couple contrôleur, action.

Après plusieurs tests, je ne parviens pas à faire ce que je souhaite. Peut-être faut-il faire ça en deux temps ? A savoir un test d'Acl dans le contrôleur.

J'ai vu des solutions dans le sujet [1.0.2] Acl, Auth et Assertions mais j'ai pensé qu'entre temps, des solutions élégantes étaient apparues pour ce problème courant.



Sephi-Chan

Dernière modification par Sephi-Chan (23-11-2008 03:17:29)

Hors ligne

 

#2 24-11-2008 09:27:45

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

Re: [Zend_Auth][1.6] Un utilisateur ne peut utiliser que ses ressources

Moi j'en suis toujours au même point. Une couche d'ACL, plus un test sur l'id utilisateur...
J'avoue que c'est chiant (un peu quand même)

Hors ligne

 

#3 24-11-2008 13:47:51

ndesaleux
Membre
Date d'inscription: 16-04-2007
Messages: 196
Site web

Re: [Zend_Auth][1.6] Un utilisateur ne peut utiliser que ses ressources

Il me semble que c'est un cas ou les assertions me paraissent utile ^^

par contre, j'ai pas bien compris ce que tu appelles "de manière élégante".

Hors ligne

 

#4 24-11-2008 14:02:27

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_Auth][1.6] Un utilisateur ne peut utiliser que ses ressources

J'ai un fonctionnement plus complet
en fait mon utilisateur n'a en général pas accès à SES ressources mais aux ressources de son groupe mais c'est la même chose mais à la place d'utiliser l'id du groupe il suffit d'utiliser l'id de l'utilisateur

toute table qui doit avoir une restriction sur le groupe (ou l'utilisateur) j'utilise un ajout automatique de la restriction dans l'objet table en php et une clef externe dans la base.

Code:

<?php
Zend_Loader::loadClass('Fast_Db_Hierarchical');
require_once dirname(__FILE__).'/Row.php';
/**
 * @package Fast_Module
 * @subpackage Adm_Module
 */
Class Adm_Model_Group_Table extends Fast_Db_Hierarchical {
...
    /**
   * Restriction for query
   *
   * @var string
   */
    protected $_restrict = array('workgroup.wkg_level >= 0');

...
    public function __construct($config = array())
    {
        parent::__construct($config);
        $user = Zend_Auth::getInstance()->getIdentity();
        #Fast_Debug::show('$user', $user);

        if ($user) {
            //L’utilisateur ne peut voir que les groupes fils de celui dans lequel in exerce sont rôle.
            $this->_restrict[] = $this->_name.'.wkg_left >= (SELECT wkg_left FROM workgroup WHERE wkg_id = '.$user->profile->wkg_id.')';
            $this->_restrict[] = $this->_name.'.wkg_right <= (SELECT wkg_right FROM workgroup WHERE wkg_id = '.$user->profile->wkg_id.')';
        } else {
            $this->_restrict = 'false'; //sans identité on ne peut rien voir dans la base
        }
    }
...
}

dans cet exemple j'utilise deux façon de définir ma contrainte une statique avec le membre _restrict
l'autre dépendant du wkg_id de l'utilisateur dans le constructeur.

cette classe dérive de Fast_Db_Table qui elle-même dérive de Zend_Db_Table

c'est dans Fast_Db_Table que j'ai mis le code qui utilise la contrainte

Code:

Class Fast_Db_Table
extends Zend_Db_Table_Abstract
{
...
   public function fetchRow($where = null, $order = null, $restrict = true)
   {
      if ($restrict&&isset($this->_restrict)&&is_string($this->_restrict))
      {
         if (is_array($where))
         {
            $where[] = $this->_restrict;
         } else {
            $where = '('.$this->_restrict.') AND ('.$where.')';
         }
      } elseif ($restrict&&isset($this->_restrict)&&is_array($this->_restrict))
      {
         if (is_array($where))
         {
            $where = array_merge($where, $this->_restrict);
         } else {
            foreach ($this->_restrict as $contraint) {
               $where = '('.$contraint.') AND ('.$where.')';
            }
         }
      }
      $res = parent::fetchRow($where,$order);
      return $res;
   }
...
   protected function _getList($select, $params=array(), $restrict = true)
   {
      if ($restrict&&isset($this->_restrict)&&is_string($this->_restrict)) {
         $select->where($this->_restrict);
      } elseif ($restrict&&isset($this->_restrict)&&is_array($this->_restrict)) {
         foreach ($this->_restrict as $contraint) {
            $select->where($contraint);
         }
      }
      $statement = $this->_db->prepare($select);
      $statement->setFetchMode(Zend_Db::FETCH_OBJ);
      $statement->execute($params);
      $list = $statement->fetchAll();
      #Fast_Debug::show('getList',$list);
      return $list;
   }
...
}

l'exemple ci dessus est relativement complexe au niveau de la contrainte
le plus souvent in suffit de mettre dans le constructeur

Code:

        if ($user) {
            //L’utilisateur ne peut voir que les ressouces de son groupe.
            $this->_restrict[] = $this->_name.'.wkg_id = '.$user->profile->wkg_id;
        } else {
            $this->_restrict = 'false'; //sans identité on ne peut rien voir dans la base
        }

les appels sont on ne peut plus simple
par exemple sur la table des groupes ci dessus

Code:

    public function getByCode($id) {
        return $this->fetchRow("workgroup.wkg_code = '".$id."'", null, false);
    }

un appel à $myGroups->getByCode('ORY'); retournera la liste des groupe dont le code est ORY et qui sont accessible par l'utilisateur courant

A+JYT

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