2013-09-22 111 views
2

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

  • 注册
  • 登录
  • EN(实际上是一个下拉,与其他可用的语言)

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

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

而对于一些用户具有特定角色/权限将有更多的项目

我想用RBAC,作为ACL显得臃肿,而且也只是为了检查如果当前登录的用户/角色有其他项目,我需要加载完整的ACL(并且我们有大约15种以上不同类型的角色)。

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

  1. 我创建一个空的导航容器,并创建一个工厂。在工厂中,我访问身份验证和RBAC并根据用户的状态/角色添加页面。
  2. 我使用所有可能的页面创建一个完全加载的导航,然后在工厂中使用身份验证和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事件并产生所希望的导航和输出添加到视图可变。

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

回答

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()那么只有菜单项的将显示用户的权限。

+0

非常感谢您的回答,作品像一个魅力。请你澄清一下$ moduleRouteListener-> attach($ eventManager);我们为什么需要这个? – write2art

+0

我试过你的解决方案@Mohammad,但我得到以下错误:严格的标准:call_user_func()期望参数1是一个有效的回调,非静态方法Application \ Listener \ RbacListener :: accept()不应被静态调用/ home /.../ zendframework/library/Zend/EventManager/EventManager.php在第468行 - 当前版本有所变化吗? – webDEVILopers

+0

这是关于@Mohammed ZeinEddin与最新版本的ZF2和ZfcRbac一起使用的相同尝试的简短教程:http://blog.webdevilopers.net/?p=9 – webDEVILopers