2

我正在使用Zend NavigationACL。我的用户可以有多个角色,它们彼此没有关系,但是Zend Navigation只接受一个角色并检查具有该角色的ACL,这对我不利。

如何为导航注册一个新的助手,以便我可以覆盖该acceptAcl方法。我试图创建和注册一个简单的视图助手,但没有奏效

class Menu extends \Zend\View\Helper\Navigation\Menu implements \Zend\ServiceManager\ServiceLocatorAwareInterface
{

    protected function acceptAcl(AbstractPage $page)
    {
        if (!$acl = $this->getAcl()) {
            // no acl registered means don't use acl
            return true;
        }

        $userIdentity = $this->getServiceLocator()->get('user_identity');
        $resource = $page->getResource();
        $privilege = $page->getPrivilege();

        $allowed = true;
        if ($userIdentity->id !== "1") {

            if ($acl->hasResource($resource)) {
                $allowed = false;
                foreach ($userIdentity->rolls as $roll) {
                    if ($acl->isAllowed($roll['id'], $resource)) {
                        $allowed = true;
                        continue;
                    }
                }
            }
        }

        return $allowed;
    }

    public function renderMenu($container = null, array $options = array())
    {
        return 'this is my menu';
    }

}

'view_helpers' => array(
    'invokables' => array(
        'myMenu' => 'Application\View\Helper\Menu',
    ),
),

我如何注册这个助手以便导航知道它?

4

3 回答 3

4

即使主题很旧,该解决方案在 ZF2 v2.3.3 中也不适用于我。

经过一番研究,我发现Navigation Helper没有共享,或者是twig模块搞砸了共享,如果我尝试在模块bootstrap中为Navigation添加自定义插件(例如新菜单),它只是无效。但是我在阅读 Navigation Helper 构造时发现了一件有趣的事情

Zend\Navigation\View\HelperConfig.php

Navigation 插件管理器可以在 key 下的模块、全局或本地配置中进行配置navigation_helpers。这是使用插件扩展 Navigation 的一种简单方法。

前任 :

模块.config.php

'navigation_helpers' => array (
    'invokables' => array(
        'menu' => 'Application\View\Helper\Navigation\Menu',
    ),
),
于 2014-10-07T07:52:32.070 回答
3

Navigation视图助手注册在ViewHelperPluginManager. 所有导航助手(MenuBreadcrumbs)都由单独的插件管理器管理。据我所知,您还不能覆盖配置中的导航助手。

尝试将以下内容添加到您的Module.php

class Module
{
    public function onBootstrap($e)
    {
        $application = $e->getApplication();
        /** @var $serviceManager \Zend\ServiceManager\ServiceManager */
        $serviceManager = $application->getServiceManager();

        $pm = $serviceManager->get('ViewHelperManager')->get('Navigation')->getPluginManager();
        $pm->setInvokableClass('myMenu', '\Application\View\Helper\Menu');
    }
}
于 2013-03-03T10:19:03.413 回答
0

我的用户可以有多个角色,它们彼此没有关系,但是 Zend Navigation 只接受一个角色并检查具有该角色的 ACL,这对我不利。

这个问题很容易解决:只需为这个用户创建一个角色,它继承自真实角色。请参阅官方文档,并搜索引用角色“someUser”的段落,您应该将其理解为指的是当前用户。因此:角色应该被动态地添加到 ACL 中。

$roles = ['staff', 'editor'];
$this->acl->addRole(new Role('currentuser'), $roles);

然后使用“currentuser”作为要检查的角色。

一个问题是您必须以正确的顺序列出“父角色”,即首先列出特权最少的角色,因为它们是以相反的顺序检查的。

您可以尝试使用类似以下代码段的内容来解决这个问题,这将忽略它无法识别的任何角色,并将它们保持在硬编码列表的顺序中。

# $userRoles is an array with the roles of the current user
$this->acl->addRole(new Role('currentuser'),
    array_intesect(['member', 'staff', 'editor', 'admin'], $userRoles));
于 2020-01-27T15:19:22.100 回答