1

我的项目要求是这样的:

在顶部,将有管理员,他将拥有所有 d 访问权限,第一级

在管理员下,将有部门负责人,除了创建部门负责人外,他们将拥有所有访问权限

在部门主管下,将有其他成员,他们将管理分配给他们的部门明智数据。

现在,所有不同的部门负责人都将拥有自己的信息和成员,并且所有部门负责人/成员都可以访问他们正在输入/管理的自己的特定记录。

现在,有了 CakePHP 的 ACL 组件,我可以划分角色和他们的访问级别,但是所有部门负责人都可以看到其他部门负责人的信息,因为他们将具有相同的访问权限,所有其他成员可以在 diff 上看到其他成员的信息部门,因为他们将具有相同级别的访问权限。

我的项目复杂性在于 - 尽管它们具有与其他人相同的级别/角色分配,但它们应该仅对其分配或创建的信息/数据可见。

谁能建议我最合适的选择,使用 CakePHP 已经可用的插件来管理所有这些事情。

我可以通过自定义默认 ACL 组件来工作,但这将花费比预期更多的时间。

任何更好的想法/建议将不胜感激!

4

1 回答 1

2

在我看来,ACL 并不是那么神奇。例如:ACL 可以管理权限以告知谁有权添加/编辑/删除产品.. 但它无法更改查询以根据定义的权限过滤产品(例如“来自 A 部门的用户只能查看 A 部门的产品").. 其实那是个谎言,ACL 可以管理它,但它可能不实用,因为每次添加产品时,您都必须创建一个 ACO,并在 AROS_ACOS 表中设置权限并且由于 AROS 是一个树结构,因此如果您打算查询数据,它很容易成为一个难题

我会使用仅限组的 ACL来控制对某些页面/操作的访问并制定如下规则:

  • “部门负责人可以访问页面'产品列表'并添加/删除/修改产品”
  • “管理员可以访问所有页面”
  • “其他用户可以访问‘产品列表’,他们可以添加产品但不能删除它们”

我会根据连接的用户相应地调整我的查询,因此在“产品列表”页面的控制器中,我会执行以下操作:

  • 如果连接的用户 blongs 到部门主管,则选择所有产品product.department_id=connected_user.department_id
  • 如果连接的用户是管理员,则选择所有产品

如果你有太多的查询并且你不想做成千上万的 if 语句,你可以创建一个组件、一个行为或者扩展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 并像往常一样使用 find 方法:

$this->Products->find('all');
于 2011-06-16T13:09:42.797 回答