我正在开发一个基于ZF2的网站。无论访客/用户状态如何,我都有一个主导航保持不变。需要添加另一个组件/导航,这取决于用户的状态和角色。对于访问者,项目将是
对于已登录的普通用户,将显示
对于具有特定角色/权限的某些用户,将有其他项目
我想使用RBAC,因为ACL看起来很臃肿,而且只是为了检查当前登录的用户/角色是否有其他项目,我需要加载完整的ACL(我们有大约15种以上不同类型的角色)
我花了一些时间思考如何实现这一目标,所以以下是我的一些想法。
PS:我需要使用partial,因为我需要在语言选择部分添加一些CSS类。导航也将显示在布局中。
答案 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()
,则只显示用户有权限的菜单项。