【问题标题】:Assign multiple roles in Zend_Navigation using Zend_ACL in Zend Framework PHP?在 Zend Framework PHP 中使用 Zend_ACL 在 Zend_Navigation 中分配多个角色?
【发布时间】:2011-11-10 20:18:52
【问题描述】:

我的 Zend_Navigation 无法正常工作,

当使用 AUth/Doctrine 登录用户时,我正在从多对多表中提取分配给用户的角色(通​​常是其中的几个角色),

然后在bootstrap.php上线: $view->navigation($navContainer)->setAcl($this->_acl)->setRole($this->_role);

我得到错误: '$role 必须是字符串、null 或 Zend_Acl_Role_Interface 的实例;数组给定'

但是,如果我使用 foreach 遍历角色 - 以前的角色将被以下角色覆盖,并且我仅获得最后一个角色的导航,

有人对此有任何合乎逻辑的解决方案吗?

真的很感激, 亚当

【问题讨论】:

    标签: php arrays roles zend-navigation zend-acl


    【解决方案1】:

    我遇到了同样的问题,但从稍微不同的角度解决了问题。我没有修改Zend_Navigation 对象以接受两个或更多角色,而是扩展了Zend_Acl 并修改了isAllowed() 方法来检查所有这些角色。 Zend_Navigation 对象使用 isAllowed() 方法,因此覆盖它解决了问题。

    My_Acl.php

    <pre><code>
    class My_Acl extends Zend_Acl
    {
        public function isAllowed($role = null, $resource = null, $privilege = null)
        {
            // Get all the roles to check against
            $userRoles = Zend_Registry::get('aclUserRoles');
            $isAllowed = false;
    
            // Loop through them one by one and check if they're allowed
            foreach ($userRoles as $role)
            {
                // Using the actual ACL isAllowed method here
                if (parent::isAllowed($role->code, $resource))
                {
                    $isAllowed = true;
                }
            }
    
            return $isAllowed;
        }
    }
    </code></pre>
    

    然后,不要创建Zend_Acl 的实例,而是使用My_Acl,将其传递给您的导航对象,它应该可以工作。

    【讨论】:

      【解决方案2】:

      你真的不应该,永远覆盖 isAllowed(),是的,有一个解决方案。创建一个实现 Zend_Acl_Role_Interface 的类,如果有记忆,它需要定义一个方法 getRole(),事实上,这可能是您用来验证用户并允许该类处理确定角色的模型。一个用户应该只有一个角色。如果应该向多个角色的用户授予对资源的访问权限但仅在某些条件下,那么您应该使用断言,这就是他们存在的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多