Zend Navigation和RBAC

时间:2013-09-22 08:19:05

标签: zend-framework2 zend-navigation rbac zend-acl zend-layout

我正在开发一个基于ZF2的网站。无论访客/用户状态如何,我都有一个主导航保持不变。需要添加另一个组件/导航,这取决于用户的状态和角色。对于访问者,项目将是

  • 注册
  • 登录
  • EN(实际上是下拉列表,其他可用语言)

对于已登录的普通用户,将显示

  • 资料
  • 注销
  • EN(上述语言选择器)

对于具有特定角色/权限的某些用户,将有其他项目

我想使用RBAC,因为ACL看起来很臃肿,而且只是为了检查当前登录的用户/角色是否有其他项目,我需要加载完整的ACL(我们有大约15种以上不同类型的角色)

我花了一些时间思考如何实现这一目标,所以以下是我的一些想法。

  1. 我创建一个空的导航容器,并创建一个工厂。在工厂中,我访问身份验证和RBAC,并根据用户的状态/角色添加页面。
  2. 我创建了一个包含所有可能页面的满载导航,然后在工厂中,在Authentication和RBAC的帮助下,我隐藏了我不想显示的页面。
  3. rd选项是使用视图助手,它将通过ServiceLayer获取RBAC并生成导航。 (如ZF2 how to display tweets in layoutZF2 : Add a Login widget in the template中讨论的那样。

  4. 或者我可以在module.php中创建一个控制器插件或只是一个方法,并监听MVC_Render或MVC_Dispatch事件并生成所需的导航并将输出添加到视图变量。
  5. PS:我需要使用partial,因为我需要在语言选择部分添加一些CSS类。导航也将显示在布局中。

1 个答案:

答案 0 :(得分:3)

我正在使用ZfcRbac,我正在执行以下操作,您可以根据用户角色和导航项权限显示导航,如下所示:

首先按以下方式为导航项添加权限:

'permission' => 'edit-profile',

然后在onBootstrap中附加一个监听器,如下所示:

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $eventManager->getSharedManager()->attach(
        'Zend\View\Helper\Navigation\AbstractHelper', 
        'isAllowed', 
        array('\Application\Listener\RbacListener', 'accept')
    );
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

然后创建一个类Application\Listener\RbacListener,如下所示:

public function accept(Event $event) { 
    $event->stopPropagation();

    $accepted = true;

    $serviceLocator = $event->getTarget()->getServiceLocator()->getServiceLocator();
    $rbac           = $serviceLocator->get('ZfcRbac\Service\Rbac');

    $params = $event->getParams();
    $page = $params['page'];

    $permission = $page->getPermission();

    if ($permission) {
        $accepted = $rbac->isGranted($permission);
    }

    return $accepted;
}

,当您显示菜单时,它将根据权限和角色进行过滤,例如,如果您执行echo $this->navigation('navigation')->menu(),则只显示用户有权限的菜单项。