Zend Navigation多个ACL角色

时间:2015-01-15 18:00:20

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

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

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

我还以department::role(例如bookings::user)的形式向ACL添加了部门角色。这是他们的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,并且菜单结构应与其部门角色相关。

1 个答案:

答案 0 :(得分:1)

对于单个用户具有多个ACL角色的IMHO看起来像反模式。 Zend_Navigation规则绑定到单个角色的(多个)资源,这使得perferct有意义。 您的约束是什么禁止您为(部门)角色提供资源? 您始终可以为ACL角色使用继承。

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

 Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl);

 Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($role);