Cake入分配上的作用根据特定数据的访问
-
28-10-2019 - |
题
我的项目的要求是这样的:
在上面,有将管理员,他们将有所有d访问,第一级
根据管理员,将有部门首长,他将有所有d访问,除了创造部门负责人
在部门负责,没有将其他成员,他们将管理其分配给新闻部明智的数据。
现在,所有不同部门的首长将拥有自己的信息和成员以及所有部门负责人/成员将有机会获得以自己特定记录,其他正在进入/管理。
现在,Cake的ACL分,我可以划分角色和他们的访问水平,但所有部门首长可以请参阅其他部门负责人的信息,因为它们将具有相同级别的访问,以及所有其他成员可以看到的其他成员的信息上的差异的部门,因为它们将具有相同级别的访问。
我的项目的复杂性的是,他们应该是可见的,只有分配给他们或者创建信息/数据,虽然它们具有相同的级别/角色分配的其他人。
任何人都可以给我建议最合适的选择,管理所有这些东西已经提供的插件Cake.
我可以通过自定义的默认ACL的组成部分,但将采取一些更多的时间,超过预期。
任何更好的想法/建议,将不胜感激!
解决方案
在我看来,ACL是不可思议的。例如:ACL可以管理的权限,以告诉谁有权访问,以增加/编辑/删除的产品..但这并不能够改变一个查询过滤产品,因此要定义的权限(如"用户部门可以只看到的产品部门一")..好实际上这是一个谎言,ACL可以管理,但这可能不是实际的,因为每次增加一个产品,就必须创建一个应用程序,并设定的权限在AROS_ACOS表,并由于阿罗斯是树形结构,因此它可以很容易地变成一个nigthmare,如果你的计划,以查询数据
我用一个 小组只ACL 控制进入某些网页/行动和做出的规则,如:
- "部长可以访问的网页 产品清单'和添加或删除/修改 产品"
- "管理员可以访问 所有网页"
- "其他用户可以访问 产品清单'和他们可以添加 产品但不是删除"
和我调整一下我的查询,因此连接的用户,因此在控制的产品清单的页面,我愿意做这样的:
- 如果连接的用户blongs部门的头,然后选择所有产品在哪里
product.department_id=connected_user.department_id
- 如果连接的用户管理然后选择所有产品
如果你有太多的查询和你不想要做成千上万的如果的句子,您可以创建一个组件,一个行为或者也许 延长 find()
方法在 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['lang']).在控制我需要做的就是附加的LocalizableBehavior和使用寻找方法如往常一样:
$this->Products->find('all');