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断言,也许它们可以帮助您。