在Zend Framework PHP中使用Zend_ACL在Zend_Navigation中分配多个角色?

时间:2011-09-05 19:43:19

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

我无法让Zend_Navigation正常工作,

使用AUth / Doctrine登录用户时,我将从多对多表中提取分配给用户的角色(通​​常是其中的一部分),

然后在bootstrap.php上:     $视图 - >导航($ navContainer) - > SETACL($这 - > _acl) - >角色setRole($这 - > _role);

我收到错误: '$ role必须是字符串,null或Zend_Acl_Role_Interface的实例;给出'

的数组

但是,如果我使用foreach循环访问角色 - 之前的角色会被以下角色覆盖,我只获得导航的最后一个角色,

有没有人对此有任何合理的解决方案?

真的很感激, 亚当

2 个答案:

答案 0 :(得分: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的实例,将其传递给导航对象,它应该可以正常工作。

答案 1 :(得分:0)

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