Php yii:如何按用户角色显示不同的菜单?
问:如何按用户角色显示不同的菜单 描述:该应用程序具有多个角色。e、 g人力资源经理、客户经理、运营经理、员工、操作员等。我使用权限和yii用户模块创建这些角色。这些角色具有不同的功能。因此,应用程序在登录后会针对不同用户的角色显示不同的菜单。现在,我可以锁定不同用户的功能。e、 g当人力资源经理登录时,他/她不能路由到用户角色的其他功能。但我不知道如何为人力资源经理显示人力资源菜单Php yii:如何按用户角色显示不同的菜单?,php,yii,yii-extensions,Php,Yii,Yii Extensions,问:如何按用户角色显示不同的菜单 描述:该应用程序具有多个角色。e、 g人力资源经理、客户经理、运营经理、员工、操作员等。我使用权限和yii用户模块创建这些角色。这些角色具有不同的功能。因此,应用程序在登录后会针对不同用户的角色显示不同的菜单。现在,我可以锁定不同用户的功能。e、 g当人力资源经理登录时,他/她不能路由到用户角色的其他功能。但我不知道如何为人力资源经理显示人力资源菜单 我不是yii的新手。但我是这些模块的新手(rihgts和yii用户) 您可以将if语句包装在您可能想要或不想要显
我不是yii的新手。但我是这些模块的新手(rihgts和yii用户) 您可以将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; ?>
如果您正在使用,您可以根据用户权限设置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
所做的():
TWebUser类扩展了CWebUser
{
private$_access=array();
公共函数checkAccess($operation,$params=array(),$allowCaching=true)
{
if($allowCaching&&$params===array()&&isset($this->\u访问[$operation]))
返回$this->_访问[$operation];
$cache=Yii::app()->会话['checkAccess'];
if($allowCaching&&!$this->getIsGuest()&&isset($cache[$operation])&&time()-$cache[$operation]['t']<1800)
{
$checkAccess=$cache[$operation]['p'];
}否则{
$checkAccess=Yii::app()->getAuthManager()->checkAccess($operation,$this->getId(),$params);
如果($allowCaching&!$this->getIsGuest())
{
$access=isset($cache)?$cache:array();
$access[$operation]=array('p'=>$checkAccess,'t'=>time());
Yii::app()->session['checkAccess']=$access;
}
}
返回$this->_access[$operation]=$checkAccess;
}
}
现在,将为整个会话设置访问结果。这意味着,如果您编辑给定帐户的RBAC权限,他们将必须注销并再次登录,以查看浏览器中反映的新更改
我希望这会有帮助!我肯定我从其他人那里找到了这个解决方法(可能是这样),但我找不到原始帖子来给他们评分。谢谢你的帮助。是的,我知道这是Guest。但我在authitem tbl有不同的角色名称,例如人力资源经理。我的问题是我不知道如何检查人力资源经理角色。我尝试了isHRManager,但它不起作用。我尝试了isAuthenticated身份验证,但它也不起作用I check其他角色作为isGuest?这将在每次执行checkAccess()时执行查询,这似乎效率不高。您好@simaremare,这是一个很好的观点,默认用户类(
CWebUser
)只缓存当前请求的这些结果,我添加了一个更高效的更新。解释得很好,谢谢。它让我对自定义RBAC有了更多的了解。
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;
}
}