4

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

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

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

4

3 回答 3

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_操作,而仅在用户可访问操作中应用普通用户访问权限检查。

您可能还想查看ACL以获得更细粒度的访问控制。

于 2010-06-13T00:58:39.563 回答
0

您可以通过以下方式获取当前用户信息 $this->Auth->user() . 您可以在回调中使用用户组 ID 来限制查询。还可以在WhoDidIt Behavior中掠夺。

于 2010-06-12T22:24:04.003 回答
0

对于任何来这里的人来说,这就是我的设置方式。

首先,我设置了一个基本的基于角色的 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 的报告。

于 2015-10-22T20:58:51.457 回答