我需要一个允许用户修改与其相关的数据的系统。
像购物中心一样,有几家商店和一个共享目录。 我希望商店能够在全局池中编辑和添加项目。但我想限制商店对自己商品的访问权限。
如何使用acl& amp; auth(当然是概念)?
答案 0 :(得分:1)
我已经看过几次这个问题了。从蛋糕的文档中可以看出:
理论上,您可以使用ACL处理应用程序中的所有项目,但我发现有一些问题:访问控制列表或ACL处理两件主要事情:需要的东西 东西,以及想要的东西。
在我看来,最好使用ACL仅授予控制器方法(CRUD)权限,并通过在查询中设置条件来管理代码中的项目权限:
$this->Items->find('all',array('conditions'=>array('store_id'=>$this->Auth->user('store_id'))))
但是您可能需要在任何地方重复此条件,以便您可以创建一个行为来修改查询以便在WHERE子句中添加条件,因此您将始终返回/编辑当前商店的项目。例如,创建一个这样的行为:
/**
* Filter query conditions with the correct `type' field condition.
*/
function beforeFind(&$model, $query)
{
/**
* Condition for the paginators that uses joins
*/
if(isset($query['joins']) && !empty($query['joins'])){
foreach($query['joins'] as $key => $joinTable){
if(ClassRegistry::init($joinTable['alias'])->hasField('store_id')){
$query['joins'][$key]['conditions'][] = $joinTable['alias'].".store_id = '".$_SESSION['store_id']."'";
}
}
}
/**
* condition for the normal find queries
*/
if($model->hasField('store_id') && $model->name != "User"){
$query['conditions'][$model->name.'.store_id'] = $_SESSION['store_id'];
}
return $query;
}
在控制器中我只需要正常调用find
方法
$this->Items->find('all');
这样,您无需进行更多查询即可查看用户是否可以访问项目。我在网站上使用过这样的东西,对我来说效果很好。