Zend_Db_Select безопасности на уровне строк - PullRequest
2 голосов
/ 17 февраля 2011

Как я могу обеспечить безопасность на уровне строк, используя Zend_Db_Select? Я могу придумать несколько вариантов, но они не совсем соответствуют шаблону.

Допустим, у меня есть users, content и много разных уровней ACL. Вот одно решение, о котором я подумал:

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

Но проблема в том, что если вы решите добавить другое поле для разных типов безопасности? Итак, я подумал, может быть, что-то вроде этого:

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

Лучше ... но это тоже не совсем правильно. То, что я хотел бы, это что-то вроде этого:

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

Но похоже, что я слишком близко подхожу к расширению или модификации библиотеки, чтобы получить что-то, что уже может быть там, но я не совсем это вижу.

У кого-нибудь еще была такая потребность, и как вы ее решили?

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Если ваша безопасность контролируется в БД, вы можете присоединиться к ней:

    $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');

Возможно, расширьте Zend_Db_Select для проверки таблиц, к которым осуществляется доступ, и сделайте так, чтобы он вызывал объекты безопасности, передавая оператор select в качестве параметра. Например, ваш класс контента может отвечать за добавление операторов joinLeft () и 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 )  

}

Пропустите расширенный цикл класса Zend_Db_Select по включенным таблицам, проверьте, есть ли функция безопасности, которую он может вызвать, а затем вызовите ее.

Другой вариант (намного менее эффективный в дБ) будет заключаться в запросе всех элементов и проверке безопасности возвращаемых строк во время итерации набора результатов.

1 голос
/ 17 февраля 2011

Расширить Zend_Db_Select.Сделайте App_Db_Select_Security и инициируйте его соответствующим образом в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...