目前我正在编写一个我有多个用户的应用程序。他们拥有的数据应该只对他们可见,而不是系统中其他经过身份验证的用户。我也有管理员来管理系统并可以访问所有信息。在不限制管理员用户的情况下限制用户访问数据的最佳方法是什么?
目前我正在使用回调来限制用户的查询,但管理员将获得相同的限制。所以我需要知道更好的方法。更重要的是,正确的方法。
例如,我希望标准用户只能查看其用户信息,并且仅限于对其信息的CRUD操作。但是,管理员应该能够看到所有用户和CRUD所有用户数据。有什么想法吗?
答案 0 :(得分:3)
你需要:
你将它们与这样的东西结合起来(简单的例子):
$user = $this->Auth->user();
$book = $this->Book->find(…);
if ($user['type'] != 'admin' && $user['id'] != $book['Book']['creator_id']) {
$this->Session->setFlash("You're not allowed to view this item");
$this->redirect('somewhere');
}
您可以在模型中创建一个方法,如
function userCanAccessItem($item, $user)
集中访问检查的逻辑并从控制器中调用它。
更好的是,如果您正在使用Cake的admin routing,则可以省略admin_
操作中的所有检查,并仅在用户可访问的操作中应用普通用户访问权限检查。
您可能还需要查看ACLs以获得更细粒度的访问控制。
答案 1 :(得分:0)
您可以获取当前用户信息this way: $this->Auth->user()
。您可以在回调中使用用户组ID来限制查询。还可以在WhoDidIt Behavior处获取战利品。
答案 2 :(得分:0)
对于任何其他来到这里的人来说,这就是我如何设置它。
首先我设置了basic Role based ACL
然后我拒绝为普通用户访问reports/all
$config['rules']['deny'][reports/all'] = 'Role/default' ;
然后在我想要保护的模型中,我添加了这个:
public function beforeFind($queryData){
//TODO:make this cleaner
App::uses('ComponentCollection', 'Controller');
App::uses('AclComponent', 'Controller/Component');
$collection = new ComponentCollection();
$this->Acl = new AclComponent($collection);
if(!$this->Acl->check(array('User'=>AuthComponent::user()),'/reports/all/')){ // must be a user (not admin)
$this->bindModel(array('hasOne' => array('ReportsUser')));
$queryData['conditions']['ReportsUser.user_id'] = AuthComponent::user('id');
$queryData['recursive'] = 2;
}
return $queryData;
}
在ACL不允许访问reports/all
的情况下,我们会向任何查找查询添加条件,因此它只显示具有正确user_id的报告。