如何在不限制CakePHP管理员用户的情况下将数据限制为拥有它的用户?

时间:2010-06-12 21:45:36

标签: cakephp cakephp-1.3

目前我正在编写一个我有多个用户的应用程序。他们拥有的数据应该只对他们可见,而不是系统中其他经过身份验证的用户。我也有管理员来管理系统并可以访问所有信息。在不限制管理员用户的情况下限制用户访问数据的最佳方法是什么?

目前我正在使用回调来限制用户的查询,但管理员将获得相同的限制。所以我需要知道更好的方法。更重要的是,正确的方法。

例如,我希望标准用户只能查看其用户信息,并且仅限于对其信息的CRUD操作。但是,管理员应该能够看到所有用户和CRUD所有用户数据。有什么想法吗?

3 个答案:

答案 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的报告。