我的项目要求是这样的:
在顶部,将有管理员,他将拥有所有d访问权限,第一级
在管理员的指导下,除了创建部门负责人之外,还有部门主管,他们都可以访问
在部门主管下,将有其他成员,他们将管理他们分配的部门明智数据。
现在,所有不同的部门负责人都将拥有自己的信息和成员,所有部门主管/会员都可以访问他们正在进入/管理的特定记录。
现在,使用CakePHP的ACL组件,我可以划分角色及其访问级别,但所有部门负责人都可以看到其他部门主管的信息,因为他们将具有相同级别的访问权限,而所有其他成员可以看到其他成员关于差异部门的信息,因为它们具有相同的访问级别。
我的项目复杂性是 - 它们应该只显示其分配或创建的信息/数据,尽管它们具有与其他人相同的级别/角色分配。
任何人都可以建议我最合适的选择,使用CakePHP已经可用的插件来管理所有这些事情。
我可以通过自定义默认ACL组件来工作,但这比预期的要花费更多的时间。
任何更好的想法/建议都将不胜感激!
答案 0 :(得分:2)
我看到它的方式,ACL并不那么神奇。例如:ACL可以管理权限,以告知谁有权添加/编辑/删除产品..但它无法更改查询以根据定义的权限过滤产品(例如"来自部门的用户A只能看到部门A")的产品......实际上,这是谎言,ACL可以管理,但可能不实用,因为每次添加产品时,您都必须创建一个ACO,并在AROS_ACOS表中设置权限,因为AROS是树结构,所以如果您计划查询数据,它很容易成为一个nigthmare
我使用group-only ACL来控制对某些网页/操作的访问权限,并制定如下规则:
并且我会相应地向连接的用户调整我的查询,因此在'产品列表的控制器中'页面,我做了类似的事情:
product.department_id=connected_user.department_id
如果你有太多的疑问并且你不想做成千上万的if句,你可以创建一个组件,一个行为或者extend the find()
method in the app_model
。我们的想法是捕获所有查询,并检查查询中使用的模型之一是否具有名为" department_id"的字段,如果他们确实将model.department_id=connected_user.department_id
条件添加到查询中。
我为一个可以在多种语言中看到的网站做到了这一点,每种语言都拥有自己的用户,数据,日志等,并且有一个管理员可以查看所有信息。并且它对我很有用=)
祝你好运!
<强>编辑:强> 我使用的行为是:
<?php
class LocalizableBehavior extends ModelBehavior {
/**
* Filter query conditions with the correct `type' field condition.
*/
function beforeFind(&$model, $query)
{
/**
* Condition for the paginators that uses joins
*/
if(isset($query['joins']) && !empty($query['joins'])){
foreach($query['joins'] as $key => $joinTable){
if(ClassRegistry::init($joinTable['alias'])->hasField('lang')){
$query['joins'][$key]['conditions'][] = $joinTable['alias'].".lang = '".$_SESSION['lang']."'";
}
}
}
/**
* condition for the normal find queries
*/
if($model->hasField('lang') && $model->name != "User"){
$query['conditions'][$model->name.'.lang'] = $_SESSION['lang'];
}
return $query;
}
}
?>
它非常简单,我更改查询以添加与当前语言匹配的条件($ _SESSION [&#39; lang&#39;])。在控制器中我需要做的就是附加LocalizableBehavior并像往常一样使用find方法:
$this->Products->find('all');