2011-02-17 1 views
2

Comment puis-je obtenir une sécurité au niveau de la ligne à l'aide de Zend_Db_Select? Je peux penser à quelques options, mais elles ne semblent pas vraiment correspondre au modèle.Zend_Db_Sélectionnez la sécurité au niveau de la ligne

Disons que j'ai users, content, et de nombreux niveaux ACL différents. Voici une solution que j'ai pensé:

$select = $db->select() 
      ->from('content') 
      ->where('content_type NOT IN (?)', 
        Model_Content::userAllowedContentTypes() 
      ) 
      ->order('date DESC') 
); 

Mais le problème est, si vous décidez d'ajouter un autre champ pour différents types de sécurité? Donc, je pensais peut-être quelque chose comme ceci:

/** 
* @var Zend_Db_Select 
*/ 
$where = Model_Content::getWhere(); 
$db->select() 
    ->from('content') 
    ->$where() 
    ->order('date DESC'); 

Mieux ... mais cela ne semble pas tout à fait correct non plus. Ce que je voudrais quelque chose de plus comme ceci:

$db->select() 
    ->from(array('c' => 'content')) 
    ->getPlugin(new Model_Content_Security('c')) 
    ->order('date DESC'); 

Mais cela semble que je suis un peu trop près d'étendre ou de modifier la bibliothèque pour obtenir quelque chose qui pourrait déjà être là, mais je ne suis pas tout à fait le voir.

Est-ce que quelqu'un d'autre a eu ce genre de besoin, et comment l'avez-vous résolu?

+0

Par sécurité au niveau de la ligne, je comprends la sécurité sur les opérations CRUD et vous pouvez le faire en étendant Zend_Db_Table_Row_Abstract et Zend_Db_Table_Abstract. Mais je ne suis pas sûr que vous en ayez besoin, jetez un oeil aux assertions de l'ACL, peut-être qu'ils peuvent vous aider. –

Répondre

1

Si votre sécurité est contrôlé dans le DB, vous pouvez gauche y joindre:

$select = $db->select() 
      ->from('content') 
      ->joinLeft(array('pt'=>'permissionTable'),'content.id = pt.contentId AND pt.userId = ' . $escapedUserId, array()) 
      ->where(pt.contentId IS NOT NULL)   
      ->order('date DESC'); 

étendre Peut-être Zend_Db_Select pour inspecter les tables en cours d'accès et l'ont fait des appels à des objets de sécurité qui passent l'instruction select en tant que paramètre . Par exemple, votre classe de contenu pourrait être responsable de l'ajout des instructions joinLeft() et where().

public function addSecurityToSelect(Zend_Db_Select $select){ 
    return $select->joinLeft(array('pt'=>'permissionTable'),'content.id = pt.contentId AND pt.userId = ' . $escapedUserId, array()) 
        ->where(pt.contentId IS NOT NULL) 

}

Demandez à votre boucle de classe Zend_Db_Select étendue à travers les tables inclus, vérifiez s'il y a une fonction de sécurité, il peut appeler et appeler.

Une autre option (beaucoup moins efficace en db) consisterait à interroger tous les éléments et à effectuer le contrôle de sécurité sur les lignes retournées lors de l'itération du jeu de résultats.

1

Étendre Zend_Db_Select. Créez App_Db_Select_Security et initez-le de manière appropriée dans le constructeur.

Questions connexes