问:如何按用户角色显示不同的菜单?
描述:该应用程序有许多角色。例如,人力资源经理、客户经理、运营经理、员工、操作员……等。我使用权限和 yii-user 模块来创建这些角色。这些角色具有不同的功能。所以应用程序会在登录后为不同用户的角色显示不同的菜单。现在,我可以为不同的用户锁定该功能。例如,当 HR 经理登录时,他/她不能路由到用户角色的其他功能。但我不知道如何仅显示人力资源经理的人力资源菜单。
我不是 yii 的新手。但我是这些模块的新手(rihgts 和 yii-user)。
问:如何按用户角色显示不同的菜单?
描述:该应用程序有许多角色。例如,人力资源经理、客户经理、运营经理、员工、操作员……等。我使用权限和 yii-user 模块来创建这些角色。这些角色具有不同的功能。所以应用程序会在登录后为不同用户的角色显示不同的菜单。现在,我可以为不同的用户锁定该功能。例如,当 HR 经理登录时,他/她不能路由到用户角色的其他功能。但我不知道如何仅显示人力资源经理的人力资源菜单。
我不是 yii 的新手。但我是这些模块的新手(rihgts 和 yii-user)。
例如,如果您使用的是RBAC,则可以根据用户权限设置 CMenu 项目的“可见”参数;
$this->widget('zii.widgets.CMenu',array(
'items'=>array(
array(
'label'=>'Home',
'url'=>array('site/index'),
),
array(
'label'=>'HR',
'url'=>array('/hr/index'),
'visible'=>Yii::app()->user->checkAccess('hr')
),
array(
'label'=>'Accounts',
'url'=>array('/account/index'),
'visible'=>Yii::app()->user->checkAccess('account')
),
array(
'label'=>'Operations',
'url'=>array('/operations/index'),
'visible'=>Yii::app()->user->checkAccess('operations')
),
),
);
这样,用户只有在对该区域具有访问权限的情况下才能看到菜单中的项目。
[编辑]
根据下面 simaremare 的评论,您可以通过扩展CWebUser
. 首先,设置你的用户运行你的新类(我们称之为TWebUser
),所以在你的 main.php 配置文件中;
'components'=>array(
'user'=>array(
...
'class'=>'TWebUser',
...
),
...
),
现在我们需要创建TWebUser
缓存这些超出当前请求(这是什么CWebUser
(源代码):
class TWebUser extends CWebUser
{
private $_access=array();
public function checkAccess($operation,$params=array(),$allowCaching=true)
{
if($allowCaching && $params===array() && isset($this->_access[$operation]))
return $this->_access[$operation];
$cache = Yii::app()->session['checkAccess'];
if($allowCaching && !$this->getIsGuest() && isset($cache[$operation]) && time() - $cache[$operation]['t'] < 1800)
{
$checkAccess = $cache[$operation]['p'];
} else {
$checkAccess = Yii::app()->getAuthManager()->checkAccess($operation,$this->getId(),$params);
if($allowCaching && !$this->getIsGuest())
{
$access = isset($cache) ? $cache : array();
$access[$operation] = array('p'=>$checkAccess, 't'=>time());
Yii::app()->session['checkAccess'] = $access;
}
}
return $this->_access[$operation] = $checkAccess;
}
}
现在您的访问结果将为整个会话设置。这确实意味着,如果您编辑给定帐户的 RBAC 权限,他们必须注销并再次登录才能看到浏览器中反映的新更改。
我希望这会有所帮助!我确定我从其他人那里找到了这个解决方法(可能是在 SO 上),但我找不到原始帖子来给予他们信任。
您可以在可能或不想显示的菜单项周围包裹一个 if 语句。
在 if 语句中,您必须测试用户是否有资格查看您的菜单项。
例如:
<?php if (Yii::app()->user->isGuest): ?>
<?php $this->widget('zii.widgets.CMenu',array(
'items'=>array(
array(
'label'=>'this menu item visible only for Guests (not logged in)',
'url'=>array('/site/index')),
),
)); ?>
<?php endif; ?>