好的,我将通过说我是蛋糕和ACL以及MVC架构来说明这一点。我正在关注其网站http://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-controlled-application/part-two.html的cakephp教程。我理解本教程的内容,但想知道将这个简单的基于组的ACL带到下一级的最简单方法。我搜索过没有用。所以,关于这个问题。
让我们在上面的教程中稍微修改一下这个函数,例如。它只是为ACO设置ARO权限。
每个区域都有很多区域,许多部门都有很多用户。
关系如下: 一个区有很多部门 - 一对多。 一个区有很多用户,用户可能有很多区(只要他们属于该区的一个部门)。 一个部门有很多用户 - 很多用户 - 很多很多。
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无法删除其他部门管理员的用户,并且Dist Admin Bar无法将所有其他Dist Admin用户的名字更改为nancy。
洛尔。我对如何实现这一目标感到很茫然。
我猜一种方法就是获得管理员级别,例如dist admin,然后找出他是哪个区域的用户。最后,将该区域中的所有用户返回到变量$ userScope。再次,我是新的蛋糕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
}
}
哎哟。授予了将这些信息组合在一起所涉及的所有连接表,这实际上是键入时看起来像medusas hair。你能看出我的逻辑线吗?这对我来说有点难以表达。让我知道我是否应该进一步澄清任何事情。
答案 0 :(得分:1)
因此,您尝试设置一个ACL系统来管理基于组ID 和控制器/操作的限制 - 您需要 department- < / strong>和基于地区的限制。
据我所知,CakePHP中的嵌入式ACL系统可以不来管理这种级别的限制。
作为解决方案,我建议您允许用户访问他们需要访问的位置(例如 dept admins 具有对用户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执行此操作强>
E.g。您(Todd)正在尝试编辑我的个人资料(NicolaeS)以更改我的员工ID,因为我当前的错误。
函数$this->getUserScope('user-ID-of-NicolaeS')
将检查您的部门ID 或区域ID是否与main相同,并允许/禁止您根据此检查继续执行操作。
这看起来是否清晰/直截了当?
电贺, 尼古拉