Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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
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
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
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.
<?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
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
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
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
Pages: 1