【问题标题】:Zend Navigation Multiple ACL rolesZend Navigation 多个 ACL 角色
【发布时间】:2015-01-15 18:00:20
【问题描述】:

我正在尝试创建一个 ACL,其中用户可能在不同部门具有不同的角色。

用户被赋予role::guestrole::user 形式的角色,具体取决于他们是否已登录。这是他们的userRole。 (还有一个role::superuser 可以访问所有部门)。

我还以department::role 的形式向ACL 添加了部门角色(例如bookings::user)。这是他们的departmentRole

用户部门角色存储在Zend_Auth 身份中。

访问控制部分通过扩展Zend_Acl 并覆盖isAllowed 函数来工作。 这成功地允许或拒绝每个用户。

public function isAllowed($role = null, $resource = null, $privilege = null)
    {
    $identity = Zend_Auth::getInstance()->getIdentity();

    $userRole = $identity->role;
    $departmentRoles = $identity->departmentRoles; 

    if (parent::isAllowed($userRole, $resource, $privilege))
        {
        return parent::isAllowed($userRole, $resource, $privilege);
        }
        else    {
                foreach ($departmentRoles as $departmentRole)
                    {
                    if(parent::isAllowed($departmentRole, $resource, $privilege))
                        {
                        return true;
                        }
                    }
                }

    return false;       
    }

我遇到的问题是Zend_Navigation 需要一个 Acl 实例和一个用户角色。我构建导航菜单的视图脚本使用$this->navigation()->accept($page),它仅针对单个用户角色进行验证。

如何为每个用户拥有多个 Acl 角色并让 Zend_Navigation 显示他们有权访问的菜单项?

如果有更好/不同/正确的方法,请分享。

谢谢

编辑:

这种方法意味着超越 isAllowed() 中的核心功能这一事实让我认为这不是正确的方法。

现在,在我的 ACL 模型中,我获取所有用户、部门和关联,并循环为每个用户创建一个数组,该数组由他们在相关部门中的各种角色组成。然后我为每个用户创建一个角色,并继承之前创建的数组中的角色。

到目前为止,这运行良好,也意味着我还可以将用户添加为资源,并允许相关管理员和部门经理有权修改他们的详细信息等。

这也意味着我可以将单个角色传递给 Zend_Navigation,并且菜单结构应该与他们的部门角色相关。

【问题讨论】:

    标签: zend-framework zend-navigation zend-auth zend-acl


    【解决方案1】:

    恕我直言,为单个用户提供多个 ACL 角色看起来像是反模式。 Zend_Navigation 规则绑定到单个角色的(多个)资源,这非常有意义。 您的哪些限制禁止您为您的(部门)角色提供资源? 您始终可以为您的 ACL 角色使用继承。

    如果您希望为单个用户提供多个角色,您可能需要有单独的 ACL 规则。

     Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl);
    
     Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($role);
    

    【讨论】:

    • 我花了几天时间研究一种更好的方法,并同意拥有多个不是正确的方法。这需要覆盖isAllowed() 这样的核心功能这一事实证明了这一点。
    • 我会接受这个答案,因为它证实了我的想法/发现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多