ZF2将BjyAuthorize与Zend\Navigation集成

ZF2将BjyAuthorize与Zend\Navigation集成,navigation,zend-framework2,Navigation,Zend Framework2,我在集成BjyAuthorize和Zend导航方面遇到问题,不知道如何解决。我试试这个,一切都很好。但我预计当我在bjyauthorize.config中定义警卫时,我的导航和警卫配置之间会出现反射(被拒绝的控制器或路线不显示导航项目)。我的问题是,导航项仍然显示,但分区得到了正确的保护。有没有办法,如何将警卫反映到导航中? Module.php中的My view helper配置 My Application/Module.php视图帮助程序配置: 'mainMenu' => funct

我在集成
BjyAuthorize
和Zend导航方面遇到问题,不知道如何解决。我试试这个,一切都很好。但我预计当我在
bjyauthorize.config
中定义警卫时,我的导航和警卫配置之间会出现反射(被拒绝的控制器或路线不显示导航项目)。我的问题是,导航项仍然显示,但分区得到了正确的保护。有没有办法,如何将警卫反映到导航中? Module.php中的My view helper配置

My Application/Module.php视图帮助程序配置:

'mainMenu' => function($sm){
                $nav = $sm->get('navigation')->menu();
                $serviceLocator = $sm->getServiceLocator();
                $acl = $serviceLocator->get('BjyAuthorize\Service\Authorize')->getAcl();
                $role = $serviceLocator->get('BjyAuthorize\Service\Authorize')->getIdentity();
                $nav->setAcl($acl);
                $nav->setRole($role); // Todo replace
                $nav->setUseAcl();
                return $nav->setUlClass('nav')->setTranslatorTextDomain(__NAMESPACE__); 
            }
'guards' => array(
    'BjyAuthorize\Guard\Controller' => array(
        array('controller' => 'cebEvent.registrationController','action' => 'add', 'roles' => array('guest','registration_manage')),
    ),
 ),
bjyauthorize.global.php中的我的防护配置

'guards' => array(
    'BjyAuthorize\Guard\Controller' => array(
        array('controller' => 'Article\Controller\Article', 'roles' => array('user')),
),
return array(
    'navigation' => array(
       'default' => array(
           'articles' => array(
                'label' => 'Articles',
                'route' => 'articles',
            ),
        ),
    ));
还有My navigation.global.php

'guards' => array(
    'BjyAuthorize\Guard\Controller' => array(
        array('controller' => 'Article\Controller\Article', 'roles' => array('user')),
),
return array(
    'navigation' => array(
       'default' => array(
           'articles' => array(
                'label' => 'Articles',
                'route' => 'articles',
            ),
        ),
    ));

我尝试将routes配置更改为module/controller/action,但仍然不起作用。

您没有在导航配置中指定资源。还要确保$role是否与bjyauthorize标识匹配

'navigation' => array(
  'default' => array(
     array(
       'label' => 'Registration',
   'resource'   => 'controller/cebEvent.registrationController:add',
   'route' => 'registration/add',
     ),
  ),
),
指定的资源必须与您的保护配置匹配:

'mainMenu' => function($sm){
                $nav = $sm->get('navigation')->menu();
                $serviceLocator = $sm->getServiceLocator();
                $acl = $serviceLocator->get('BjyAuthorize\Service\Authorize')->getAcl();
                $role = $serviceLocator->get('BjyAuthorize\Service\Authorize')->getIdentity();
                $nav->setAcl($acl);
                $nav->setRole($role); // Todo replace
                $nav->setUseAcl();
                return $nav->setUlClass('nav')->setTranslatorTextDomain(__NAMESPACE__); 
            }
'guards' => array(
    'BjyAuthorize\Guard\Controller' => array(
        array('controller' => 'cebEvent.registrationController','action' => 'add', 'roles' => array('guest','registration_manage')),
    ),
 ),

您能否发布一个使用Guard\Route而不是Controller的使用示例?本例中我的示例路线:

'guards' => array(
    'BjyAuthorize\Guard\Route' => array(
        array('route' => 'zfcadmin/sap-targetvalue/index', 'roles' => array('guest', 'user')),
        array('route' => 'zfcadmin/sap-targetvalue/create', 'roles' => array('user')),
    )
);

要使用BjyAuthorize\Guard\Route帮助尝试此操作的任何人

您需要在路由名称前面加上
route/
,并将其用作资源值

如果你的配置有这样一个守卫

'guards' => array(
    'BjyAuthorize\Guard\Route' => array(
         array('route' => 'zfcadmin/zfcuseradmin/list', 'roles' => array('admin')),
     )
);
您可以为导航定义类似的内容

'navigation' => array(
    'default' => array(
        'admin' => array(
            'label' => 'Admin',
            'route' => 'zfcadmin',
            'pages' => array(
                'users' => array(
                    'resource' => 'route/zfcadmin/zfcuseradmin/list', // route resource ;)
                    'label' => 'Users',
                    'route' => 'zfcadmin/zfcuseradmin/list',
                ),
            ),
        ),
    ),
),
通过将默认ACL和角色放置在模块的onBootstrap方法中,可以设置默认ACL和角色

$sm   = $e->getApplication()->getServiceManager();
$auth = $sm->get('BjyAuthorize\Service\Authorize');

$acl  = $auth->getAcl();
$role = $auth->getIdentity();
\Zend\View\Helper\Navigation::setDefaultAcl($acl);
\Zend\View\Helper\Navigation::setDefaultRole($role);

我希望这对其他人有所帮助。

正如griesi提到的,您只需要在导航配置中指定资源

在他的示例中,他将此控制器和操作称为资源

控制器/cebEvent.注册控制器:添加

我只想补充一点,这个版本也可以工作(在这种情况下,没有操作)

'资源'=>'控制器/游戏\控制器\列表'


也许这对某人有帮助。我认为这是行不通的,因为它看起来非常错误;)

谢谢你的建议,你是对的。问题在于我没有指定资源。嗨,这很有效。但是如何检查用户是否经过身份验证?方法hasIdentity()不存在…@cwhisperer BjyAuthorize用于。使用了
Zend\Authentication\AuthenticationService
,它具有您正在寻找的
hasIdentity()
方法。您是对的,thx。。。在此上下文中还有一个问题:在我可以使用$this->isAllowed('route/xyz')的视图中,如何在视图帮助程序中使用帮助程序isAllowed()?我不是这方面的专家,但您应该能够在另一个视图帮助程序中调用
$this->getView()->isAllowed('route/xyz')
。我不知道你为什么要这么做,但我不是来判断的;)