加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – yii:如何按用户角色显示不同的菜单?

发布时间:2020-12-13 22:10:12 所属栏目:PHP教程 来源:网络整理
导读:问:如何按用户角色显示不同的菜单? 描述:该应用程序有很多角色.例如人力资源经理,客户经理,运营经理,员工,操作符……等.我使用权利和yii用户模块来创建这些角色.这些角色具有不同的功能.因此,应用程序将在登录后显示不同用户角色的不同菜单.现在,我可以锁
问:如何按用户角色显示不同的菜单?

描述:该应用程序有很多角色.例如人力资源经理,客户经理,运营经理,员工,操作符……等.我使用权利和yii用户模块来创建这些角色.这些角色具有不同的功能.因此,应用程序将在登录后显示不同用户角色的不同菜单.现在,我可以锁定不同用户的功能.例如,当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所做的(source code):

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上),但我找不到原始帖子给予他们信任.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读