【问题标题】:restricting aro scope in cakephp在 cakephp 中限制 aro 范围
【发布时间】:2013-02-26 21:25:32
【问题描述】:

好的,我先说我是蛋糕和 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
 }
}

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

【问题讨论】:

    标签: cakephp permissions scope acl restrictions


    【解决方案1】:

    因此,您正在尝试设置一个 ACL 系统,该系统管理的限制不仅仅基于 组 IDcontroller/action - 您需要 department- 和基于地区的 限制。
    据我所知,CakePHP 中的嵌入式 ACL 系统无法管理这种级别的限制。

    作为一种解决方案,我建议您允许用户访问他们需要访问的位置(例如 dept adminsuser 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 相同,并根据此检查允许/禁止您继续执行操作。

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

    您好, 尼古拉

    【讨论】:

    • @Todd 所以我通过编辑我的答案进一步回答了你。请在上面检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多