-1

好的,我先说我是蛋糕和 ACL 以及 MVC 架构的菜鸟。我正在关注其网站http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/part-two.html上的 cakephp 教程。我了解本教程的内容,但想知道将这个基于组的简单 ACL 提升到新水平的最简单方法。我搜索了SO无济于事。所以,继续这个问题。

例如,让我们对上述教程中的函数进行稍微修改的版本。它只是为 ACO 设置 ARO 权限。

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

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

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 不能删除另一个 Dept Admin 的用户,Dist Admin Bar 不能将所有另一个 Dist Admin 的用户名更改为 nancy。

哈哈。我对如何做到这一点感到非常茫然。

我想一种方法是获得管理员等级,例如 dist admin,然后找出他是哪个地区的用户。最后,将该地区的所有用户返回到变量 $userScope 中。同样,我是 cake 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
 }
}

哎哟。授予将这些信息组合在一起所涉及的所有连接表,这在实际输入时一定看起来像美杜莎的头发。你能看到我的逻辑吗?这对我来说有点难以表达。让我知道我是否应该进一步澄清任何事情。

4

1 回答 1

1

因此,您正在尝试建立一个 ACL 系统来管理基于组 ID控制器/操作以外的限制- 您需要基于部门地区的限制。
据我所知,CakePHP 中的嵌入式 ACL 系统无法管理这种级别的限制。

作为一种解决方案,我建议您允许用户访问他们需要访问的位置(例如,部门管理员对用户 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执行此操作。

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

这看起来足够清晰/直截了当吗?

问候,尼古拉

于 2013-03-11T16:32:15.053 回答