Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend_Db_选择行级安全性_Php_Zend Framework_Zend Db Select_Row Level Security - Fatal编程技术网

Php Zend_Db_选择行级安全性

Php Zend_Db_选择行级安全性,php,zend-framework,zend-db-select,row-level-security,Php,Zend Framework,Zend Db Select,Row Level Security,如何使用Zend\u Db\u Select实现行级安全性?我可以想出一些选择,但它们似乎并不完全适合这种模式 假设我有用户,内容,以及许多不同的ACL级别。我想到了一个解决方案: $select = $db->select() ->from('content') ->where('content_type NOT IN (?)', Model_Content::userAllowed

如何使用
Zend\u Db\u Select
实现行级安全性?我可以想出一些选择,但它们似乎并不完全适合这种模式

假设我有
用户
内容
,以及许多不同的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');
更好。。但这感觉也不太对。我想要的是更像这样的东西:

/**
 * @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');
但我似乎离扩展或修改库有点太近了,无法得到可能已经存在的东西,但我还没有完全看到它


还有其他人有这种需求吗?您是如何解决的?

扩展Zend_Db_Select。让App_Db_选择_Security并在构造函数中适当初始化它

如果您的安全性在数据库中受到控制,您可以加入数据库:

    $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类在包含的表中循环,检查是否有它可以调用的安全函数,然后调用它


另一个选项(数据库效率要低得多)是查询所有项,并在遍历结果集时对返回的行进行安全检查。

通过行级安全性,我了解CRUD操作的安全性,您可以通过扩展Zend_db_Table_row_Abstract和Zend_db_Table_Abstract来实现这一点。但我不确定您是否需要这些,请看一下ACL断言,也许它们可以帮助您。