将组和用户的蛋糕ACL添加到项目中

时间:2013-04-07 13:30:55

标签: acl cakephp-2.1

我目前正在开发一个平台,计划在未来协调与客户的沟通。用户可以添加到项目中并具有某些权限。因此,用户被分配到不同的用户角色(admin / manager / member / viewer)。管理员可以查看所有项目,并允许其他用户添加到项目中。如果用户(例如角色:成员)被添加到项目中,他将拥有某些权利(取决于角色),如果没有,则根本不允许他访问该项目。

我正在使用Cake的ACL组件,当我忽略用户是否添加到项目时,一切都运行良好。我能想到的唯一解决方案,不是在组级别上授予权限,而是在管理员将用户添加到项目时在用户级别上授予权限。

有没有更简单的方法来解决这个问题?否则我担心代码会变得完全混乱。

1 个答案:

答案 0 :(得分:0)

还有另一种方式(我真的不知道是否更容易,取决于你的观点)。 ACL组件仅帮助您创建角色,但您需要角色和项目访问管理,对吧?

在这种情况下我做了什么:

  1. 在数据库中创建一个Project_Permission表(给它一个更好的名字,我缺乏想象力)。根据您的项目,创建关联:用户可以与许多项目相关,项目可以让许多用户访问它。如果您遵循蛋糕约定(并且您的表是命名用户和项目)并且它不会干扰您已有的内容,那么该表应该是

    PROJECTS_USERS
    id
    project_id
    user_id
    created and modified  //if you want to
    
  2. 在管理员(或其他类型,如果用户,由您自己决定)中创建适当的操作 可以将用户添加到项目中并保存多对多关联 以前创建的表。

  3. 由于项目授权不是来自ACL组件,因此您必须自己创建“授权”功能。我建议将它放在AppController的beforeFilter()函数中(如果你没有AppController,你必须在你希望它工作的每个控制器中都这样做)。在此函数中,检查记录的用户是否在现有表中并与项目关联。类似的东西:

    function beforeFilter() {
        //let's assume you have the project id somewhere, in a global variable like $this->_projectID
        $user = $this->Session->read('Auth.User.id');
        $project = $this->Project->find('first', array('conditions'=>array('id'=>$this->_projectID, 'User.id'=>$user)
        if (count($project) > 0) {
            //the user has permission to see the project
        } else {
            //he doesn't
        }
    }
    
  4. 很难给出一个实际的代码,因为我不确定你的模型关联,也不知道你想要代码的位置,或者你是否有可用的变量,但我希望你能得到这个想法。之后,只需要处理访问限制(通常涉及闪存消息和重定向)。

    我希望这很清楚:S