2

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

  • 登记
  • 登录
  • EN(实际上是一个下拉菜单,带有其他可用语言)

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

  • 轮廓
  • 登出
  • EN(如上所述的语言选择器)

对于某些具有特定角色/权限的用户,会有额外的项目

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

我花了一些时间思考我是如何做到这一点的,所以以下是我的一些想法。

  1. 我创建了一个空的导航容器,并创建了一个工厂。在工厂中,我访问身份验证和 RBAC 并根据用户的状态/角色添加页面。
  2. 我用所有可能的页面创建了一个完全加载的导航,然后在工厂中,在身份验证和 RBAC 的帮助下,我隐藏了我不想显示的页面。
  3. rd 选项是使用视图助手,它将通过 ServiceLayer 获取 RBAC 并生成导航。(如ZF2 如何在布局中显示推文ZF2 中所述:在模板中添加登录小部件

  4. 或者我可以在 module.php 中创建一个控制器插件或一个方法,然后监听 MVC_Render 或 MVC_Dispatch 事件并生成所需的导航并将输出添加到视图变量。

PS:我需要使用部分,因为我需要在语言选择部分添加一些 CSS 类。导航也将显示在布局中。

4

1 回答 1

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()则只会显示用户有权访问的菜单项。

于 2013-09-22T09:13:50.780 回答