0

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

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

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

4

1 回答 1

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
        }
    }
    

很难给出一个实际的代码,因为我不确定你的模型关联,也不知道你想要代码在哪里,或者你是否有到处可用的变量,但我希望你能明白。在那之后,这只是您要如何处理访问限制的问题(通常涉及闪存消息和重定向)。

我希望这足够清楚:S

于 2013-04-09T17:24:30.917 回答