在CakePHP中,如何将数据限制为拥有它的用户,而不限制管理员用户?

在CakePHP中,如何将数据限制为拥有它的用户,而不限制管理员用户?,cakephp,cakephp-1.3,Cakephp,Cakephp 1.3,目前我正在编写一个有多个用户的应用程序。他们拥有的数据应该只对他们可见,而不是对系统中其他经过身份验证的用户可见。我还有管理系统的管理员,他们可以访问所有信息。在不限制管理员用户的情况下,限制用户访问其数据的最佳方法是什么 目前我正在使用回调来限制用户的查询,但是管理员将得到相同的限制。所以我需要知道一个更好的方法。更重要的是,正确的方法 例如,我希望标准用户能够仅查看其用户信息,并且仅限于对其信息执行CRUD操作。但是,管理员应该能够查看所有用户并CRUD所有用户数据。有什么想法吗?您可以获取

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

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


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

您可以获取当前用户信息
$this->Auth->user()
。您可以在回调中使用用户组id来限制查询。还可以在以下位置获取战利品。

您需要:

  • 关于当前用户的信息
  • 有关该项目的信息
您可以将它们与以下内容相结合(简单示例):

您可以在模型中创建一个方法,如

function userCanAccessItem($item, $user)
集中访问检查的逻辑并从控制器调用它

更好的是,如果您正在使用Cake's,您可以省略
管理
操作中的所有检查,而只在用户可访问的操作中应用普通用户访问权限检查


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

对于其他任何来到这里的人,我就是这样设置的

首先,我建立了一个

然后我拒绝正常用户访问
报告/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
的情况下,我们为任何查找查询添加了一个条件,以便它只显示具有正确用户id的报告。

这似乎是一种“全局用户”方法。我的管理员用户在$this->Auth中与标准用户相同。但数据中并不总是有这个群体。例如,如果我有一个用户正在添加图书,则组ID将不在图书表中。但是每个用户应该只能查看他们的书籍。管理员应该能够查看所有书籍。我不确定你分享的东西是否会起作用。我不需要按用户跟踪更新,我需要限制可以访问的数据。如果您要使用WhoDidIt行为,您将在BOOK表中的
created\u by
列中拥有用户id(创建记录的人)。如果用户已登录,
$this->Auth->user()
中应该有用户id和组id。如果
$this->Auth->user('id')
创建的
相同,或者
$this->Auth->user('group_id')
为“admin”,则允许记录。感谢您的回复。这与已经提供的另一个答案类似。但同样,['type']不是用Auth设置的。这是我需要在某个地方手动执行还是使用覆盖?我使用管理路由,这就是为什么我有困难。例如,如果我在模型中放置回调(这似乎是最好的方法,因为它可以在全局范围内完成),那么同样的限制也将应用于管理员。这似乎仍然不是最明显的“卡基什”方式。@cdburges我相信
$This->Auth->user()
的信息只是存储在
$This->Session->read('Auth')
中。您可以在登录时在此处写入解析用户类型所需的任何附加信息。您不应该将用户身份验证放在模型回调中,因为这将严重限制模型的灵活性。身份验证是在控制器中完成的。我们可以使用ACL进行行级访问控制吗?这非常糟糕,原因有两个:第一,在模型中使用组件,第二,也是更重要的是-(db)ACL是一个非常糟糕的选择,无法解决“如何在不限制管理员用户的情况下将数据限制到拥有它的用户”。如果不清楚为什么,考虑一百万个用户和一百万个产品需要有多少个ARO、ACO和许可记录来表达一个规则。首先,就像我在别处所说的,除了ACL组件之外,没有其他方法访问ACL信息。其次,您似乎没有注意到我建议使用基于角色的ACL,然后您只有2个ARO,“admin”和“user”,然后您只有1个ACO
Reports/all
。我也不推荐db acl,而是推荐phpAcl。显然,如果(AuthComponent::user('role')=='admin')…,您可以执行
但是如果您有管理员用户,您可能需要其他ACL类型的活动。我将投票关闭此问题,因为解决方案的内容不再可用。我添加了一个新的解决方案,这可能很有用。仅仅因为解决方案不可用并不意味着这是“离题的”。
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;
}