博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Yii简单的基于角色的访问控制
阅读量:6501 次
发布时间:2019-06-24

本文共 3468 字,大约阅读时间需要 11 分钟。

public function filters(){ return array( 'accessControl', // perform access control for CRUD operations );}      public function accessRules(){  return array( array('allow', 'action'=>array('admin'), 'roles'=>array('staff', 'devel'), ), array('deny',  // deny all users 'users'=>array('*'), ), );}

用户模型

在用户表中新增一列,列名 roles。建立相应的模型。在这里它将被命名为 “User”。

当添加用户可以给他们分配角色 “管理员”,“用户”,“员工”等等。

验证

在文件 protected/components/UserIdentity.php 添加如下内容:

class UserIdentity extends CUserIdentity{    private $id;          public function authenticate()    {        $record=User::model()->findByAttributes(array('email'=>$this->username));        if($record===null)            $this->errorCode=self::ERROR_USERNAME_INVALID;        else if($record->password!==md5($this->password))            $this->errorCode=self::ERROR_PASSWORD_INVALID;        else        {            $this->id=$record->id;            $this->setState('roles', $record->roles);                        $this->errorCode=self::ERROR_NONE;           }        return !$this->errorCode;    }          public function getId(){        return $this->id;    }}

 

重要的一行是 $this->setState('roles', $record->roles);他给会话增加了用户角色。你可以使用 Yii:app()->user->getState("roles") 或 Yii::app()->user->roles 获取用户角色。

检查权限:结构

在 protected/components 文件夹下修改并创建文件 WebUser.php ,然后重写 checkAccess() 方法。

id)) { // Not identified => no rights return false; } $role = $this->getState("roles"); if ($role === 'admin') { return true; // admin role has access to everything } // allow access if the operation request is the current user's role return ($operation === $role); }}

在 checkAccess() 方法中你可以定义自己的逻辑。

确保类可以被yii使用配置文件 "protected/config/main.php" 必须包含以下内容:

'components' => array( // ... 'user' => array( 'class' => 'WebUser', ),

旁注:

[CWebUser::checkAccess()] 通常连接yii的验证系统。这里我们使用一个简单的处理角色的系统来替换[CAuthManager] 定义的分级系统。详细教程参加 

检查权限: 使用

  • 在你的 PHP 代码中使用 Yii::app()->user->checkAccess('admin') 来检查当前用户是否有 ‘admin’ 角色。当用户拥有 "staff" 或 "admin" 角色时,调用 Yii::app()->user->checkAccess("staff") 将会返回 true。

  • 在控制器中你可以使用 accessRules() 中的 "roles" 属性进行过滤。

见下面的例子。

怎样过滤动作

控制器必须包含以下代码:

public function filters(){ return array( 'accessControl', // perform access control for CRUD operations );}      public function accessRules(){  return array( array('allow', 'action'=>array('admin'), 'roles'=>array('staff', 'devel'), ), array('deny',  // deny all users 'users'=>array('*'), ), );}

这里对控制器中的 "admin" 动作进行了限制访问: 只有拥有 "staff" 或 “devel” 角色才可以访问。

想API文档中描述的那样 , “roles” 属性实际上调用的是 Yii::app()->user->checkAccess() 方法。

怎样根据角色显示不同菜单

你只需使用一个基于用户角色的菜单。例如:

user; // just a convenience to shorten expressions$this->widget('zii.widgets.CMenu',array( 'items'=>array( array('label'=>'Users', 'url'=>array('/manageUser/admin'), 'visible'=>$user->checkAcces('staff')), array('label'=>'Your Ideas', 'url'=>array('/userarea/ideaList'), 'visible'=>$user->checkAcces('normal')), array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>$user->isGuest), array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!$user->isGuest) ),));?>

更进一步: 访问上下文

一个通常的需求,用户只能够修改自己的数据。在这种情况下,用户的角色是没有任何意义的:将要修改的数据。

这就是为什么 [CWebUser::checkAccess()] 有一个可选的参数 "$param" 。现在假设我们要检查的是一个用户是否有权更新Post记录的权限。我们可以这样写:

if (Yii::app()->user->checkAccess('normal', $post)) {.....}

当然 WebUser::checkAccess() 必须被扩展来使用 "$params" 参数。这将取决于你的应用程序的逻辑。比如, 这可能是非常简单的 $post->userId == $this->id

 

From: 

 

备注:此文本人未验证成功,留作以后参考。

附:

创建用户菜单 Portlet

转载于:https://www.cnblogs.com/imxiu/p/3450300.html

你可能感兴趣的文章
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
html绝对定位重叠,HTML_firefox下绝对定位元素重叠造成不可点击问题,重构地图网站过程中碰到的,f - phpStudy...
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
html显示服务器状态,显示服务器时间并一直显示(html代码)
查看>>
在线html代码优化,网站seo优化html代码方法
查看>>
HTML如何把输入框变成必填值,required输入框为必填项
查看>>
在html中哪一个不是链接的目标属性,HTML试题
查看>>
android otg 挂载流程,android USB OTG功能如何打开及实现
查看>>
html属性board,pin_board.html
查看>>
html定位有几种,POSITION定位有哪几种?各有什么特点?
查看>>
背锅侠逆袭之路
查看>>
演示:使用协议分析器取证IPv6的报文结构
查看>>
oracle 11gr2 rac中的4种IP解说
查看>>
为什么你找不到工作?
查看>>
20 个免费的 jQuery 的工具提示插件:
查看>>
只有在北方的中国帝国能力享受免费的商业课程:财富规划法与愿景
查看>>
汇编语言的应用
查看>>
device platform 相应的表
查看>>
php des 加密解密实例
查看>>
【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
查看>>