限制在cakephp中的aro范围

时间:2013-03-11 15:56:52

标签: cakephp permissions scope acl restrictions

好的,我将通过说我是蛋糕和ACL以及MVC架构来说明这一点。我正在关注其网站http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/part-two.html的cakephp教程。我理解本教程的内容,但想知道将这个简单的基于组的ACL带到下一级的最简单方法。我搜索过没有用。所以,关于这个问题。

让我们在上面的教程中稍微修改一下这个函数,例如。它只是为ACO设置ARO权限。

每个区域都有很多区域,许多部门都有很多用户。

关系如下: 一个区有很多部门 - 一对多。 一个区有很多用户,用户可能有很多区(只要他们属于该区的一个部门)。 一个部门有很多用户 - 很多用户 - 很多很多。

public function initDB() {
    $group = $this->User->Group;

    //Allow admins to everything
    $group->id = 1;
    $this->Acl->allow($group, 'controllers');

    // issue 1) allow district managers to districts, departments, users
    $group->id = 2;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Districts');
    $this->Acl->allow($group, 'controllers/Departments');
    $this->Acl->allow($group, 'controllers/Users');

    //issue 2) allow department managers to edit departments and users
    $group->id = 3;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Departments');
    $this->Acl->allow($group, 'controllers/Users');
    //we add an exit to avoid an ugly "missing views" error message
    echo "all done";
    exit;

}

好的,所以设置这些权限虽然绝对方便,但确实解决了一小部分问题。就目前而言,我实际上只是阻止了部门管理员执行区级功能。区管理员和部门管理员都可以无限制地执行用户CRUD

我想做的是,将每个管理员类型USER CRUD的范围限制为仅存在于其部门或区域内的用户。例如,Department Admin Foo无法删除其他部门管理员的用户,并且Dist Admin Bar无法将所有其他Dist Admin用户的名字更改为nancy。

洛尔。我对如何实现这一目标感到很茫然。

我猜一种方法就是获得管理员级别,例如dist admin,然后找出他是哪个区域的用户。最后,将该区域中的所有用户返回到变量$ userScope。再次,我是新的蛋糕PHP,并不知道如何执行这个提议,即使这是一个好主意和最好的方法来处理这个。有什么建议??在此先感谢!!!

编辑:有用的答案,@ nicolae。

然而,似乎我仍然可以编写一个函数来返回任何给定管理员(任何给定的aco)被允许编辑的所有用户。对我来说似乎是这样的,因为我假设管理员,他/她自己是退回用户群的一部分。例如,dist 9的dist admin,位于dist 9;同样,部门的管理员1,居住在第1部门。

could i write something like:

 public getUserScope(){
 $id = $this->Auth->user('id');
 $dept = $this...
 $dist = $this...
 $access_level = $this->Session->read('Auth.User.group_id');
 if($access_level == 3){
      //get all users in this user's dept
 } elseif($access_level == 2) {
     //find all users in this user's dist
 } elseif($access_level == 1) {
      //find all users
 }
}

哎哟。授予了将这些信息组合在一起所涉及的所有连接表,这实际上是键入时看起来像medusas hair。你能看出我的逻辑线吗?这对我来说有点难以表达。让我知道我是否应该进一步澄清任何事情。

1 个答案:

答案 0 :(得分:1)

因此,您尝试设置一个ACL系统来管理基于组ID 控制器/操作的限制 - 您需要 department- < / strong>和基于地区的限制。
据我所知,CakePHP中的嵌入式ACL系统可以来管理这种级别的限制。

作为解决方案,我建议您允许用户访问他们需要访问的位置(例如 dept admins 具有对用户CRUD 接口的ACL访问权限)并插入特定的控制器中的限制。

function editUserFromDepartment($userId = NULL) {
    // Custom ACL check
    if (! $this->__checkDepartmentByUserId($userId)) {
        // Show the user a custom error message and redirect him to index page
    }

    // User editing code ...
}

function __checkDepartmentByUserId($userId) {
    $dept = $this->Department->getByUserId($userId);

    // Check if the current user belongs to this department
    $currentUserDepartmentId = $this->Session->read('Auth.User.department_id');

    return ($dept['Department']['id'] != $currentUserDepartmentId);
}

祝你好运,如果我的解释足够明确,请告诉我。

尼古拉

修改(试图回答@ Todd的编辑): 我明白你的意思了。 您的代码旨在获取当前用户可以访问的所有用户。 而不是那样,我会有一个基于事件的方法:当用户 X 尝试编辑时,执行一个查询,查找是否允许Auth.User对用户 X执行此操作

E.g。您(Todd)正在尝试编辑我的个人资料(NicolaeS)以更改我的员工ID,因为我当前的错误。
函数$this->getUserScope('user-ID-of-NicolaeS')将检查您的部门ID 区域ID是否与main相同,并允许/禁止您根据此检查继续执行操作。

这看起来是否清晰/直截了当?

电贺, 尼古拉