【问题标题】:ZF2 Integrating BjyAuthorize with Zend\NavigationZF2 将 BjyAuthorize 与 Zend\Navigation 集成
【发布时间】:2012-11-28 18:14:37
【问题描述】:

我在集成 BjyAuthorize 和 Zend 导航时遇到问题,不知道如何解决。我试试这个manual,一切正常。但我希望当我在bjyauthorize.config 中定义守卫之后,我的导航和守卫配置之间会有反射(被拒绝的控制器或路由不显示导航项)。我的问题是导航项仍然显示,但部分受到正确保护。有什么办法,如何将警卫反映到导航中? 我在 Module.php 中的视图助手配置

我的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__); 
            }

我在 bjyauthorize.global.php 中的守卫配置

'guards' => array(
    'BjyAuthorize\Guard\Controller' => array(
        array('controller' => 'Article\Controller\Article', 'roles' => array('user')),
),

还有我的navigation.global.php

return array(
    'navigation' => array(
       'default' => array(
           'articles' => array(
                'label' => 'Articles',
                'route' => 'articles',
            ),
        ),
    ));

我尝试将路由配置更改为模块/控制器/操作,但仍然无法正常工作。

【问题讨论】:

    标签: navigation zend-framework2


    【解决方案1】:

    为了帮助任何尝试使用 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',
                    ),
                ),
            ),
        ),
    ),
    

    您可以通过将其放置在模块的 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);
    

    我希望这对那里的人有所帮助。

    【讨论】:

    • 您好,这很好用。但是如何检查用户是否经过身份验证? hasIdentity() 方法不存在...
    • @cwhisperer BjyAuthorize 适用于authorization NOT authenticationZfcUser Module 使用 Zend\Authentication\AuthenticationService,它具有您正在寻找的 hasIdentity() 方法。
    • 你是对的,thx...在这种情况下还有一个问题:在一个视图中我可以使用$this->isAllowed('route/xyz'),我如何使用助手isAllowed( ) 在视图助手中?
    • 我不是这方面的专家,但你应该可以在另一个视图助手中调用$this->getView()->isAllowed('route/xyz')。我不确定你为什么需要这样做,但我不是来判断的;)
    【解决方案2】:

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

    'navigation' => array(
      'default' => array(
         array(
           'label' => 'Registration',
       'resource'   => 'controller/cebEvent.registrationController:add',
       'route' => 'registration/add',
         ),
      ),
    ),
    

    指定的资源必须与你的守卫配置相匹配:

    'guards' => array(
        'BjyAuthorize\Guard\Controller' => array(
            array('controller' => 'cebEvent.registrationController','action' => 'add', 'roles' => array('guest','registration_manage')),
        ),
     ),
    

    【讨论】:

    • 谢谢你的建议,你是对的。问题在于我没有指定资源。
    【解决方案3】:

    您能否发布一个使用 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')),
        )
    );
    

    【讨论】:

      【解决方案4】:

      正如 griesi 所说,您只需要在导航配置中指定资源即可。

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

      控制器/cebEvent.registrationController:添加

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

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

      也许它对某人有帮助。我认为这永远不会奏效,因为它看起来非常错误;)

      【讨论】:

        猜你喜欢
        • 2012-09-13
        • 2013-04-13
        • 1970-01-01
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多