我目前正在开发一个平台,计划在未来协调与客户的沟通。用户可以添加到项目中并具有某些权限。因此,用户被分配到不同的用户角色(admin / manager / member / viewer)。管理员可以查看所有项目,并允许其他用户添加到项目中。如果用户(例如角色:成员)被添加到项目中,他将拥有某些权利(取决于角色),如果没有,则根本不允许他访问该项目。
我正在使用Cake的ACL组件,当我忽略用户是否添加到项目时,一切都运行良好。我能想到的唯一解决方案,不是在组级别上授予权限,而是在管理员将用户添加到项目时在用户级别上授予权限。
有没有更简单的方法来解决这个问题?否则我担心代码会变得完全混乱。
答案 0 :(得分:0)
还有另一种方式(我真的不知道是否更容易,取决于你的观点)。 ACL组件仅帮助您创建角色,但您需要角色和项目访问管理,对吧?
在这种情况下我做了什么:
在数据库中创建一个Project_Permission表(给它一个更好的名字,我缺乏想象力)。根据您的项目,创建关联:用户可以与许多项目相关,项目可以让许多用户访问它。如果您遵循蛋糕约定(并且您的表是命名用户和项目)并且它不会干扰您已有的内容,那么该表应该是
PROJECTS_USERS
id
project_id
user_id
created and modified //if you want to
在管理员(或其他类型,如果用户,由您自己决定)中创建适当的操作 可以将用户添加到项目中并保存多对多关联 以前创建的表。
由于项目授权不是来自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