Yii中srbac权限扩展模块工作原理与用法分析


Posted in PHP onJuly 14, 2016

本文实例讲述了Yii中srbac权限扩展模块工作原理与用法。分享给大家供大家参考,具体如下:

1. 设置权限规则表:可放在module模块配置文件里面

public function init() {
  //操作权限表,必须存在以下字段:
  //itemname角色名/ID,
  //type授权项目类型/1(任务)或者2(角色),
  //bizrule权限/逻辑运算表达式为false是有权限操作,
  //data数据/YII暂无利用
  Yii::app()->authManager->itemTable = 'AuthItem';
  //会员组-权限对应表,必须存在以下字段:
  //child子角色/ID,
  //parent父角色/ID,此表可循环执行,可多级继承
  Yii::app()->authManager->itemChildTable = 'uthItemChild';
  //会员-会员组对应表,会员组可直接为操作名称,必须存在以下字段:
  //itemname角色名/ID,
  //userid用户名/ID,
  //bizrule权限/逻辑运算表达式为false是有权限操作,
  //data数据/YII暂无利用
  Yii::app()->authManager->assignmentTable = 'zd_mem_glog';

2. 实现规则,所在控制器继承基类SBaseController,原来为Controller

class ProductController extends SBaseController
{
    ........
}
class SBaseController extends Controller
{
    ........
}

3. SBaseController继承基类Controller,前填加beforeAction,实现权限验证。

protected function beforeAction($action) {
  //载入模块分隔符
 $del = Helper::findModule('srbac')->delimeter;
 //取得前模块名称
 $mod = $this->module !== null ? $this->module->id . $del : "";
 $contrArr = explode("/", $this->id);
 $contrArr[sizeof($contrArr) - 1] = ucfirst($contrArr[sizeof($contrArr) - 1]);
 $controller = implode(".", $contrArr);
 $controller = str_replace("/", ".", $this->id);
 // 生成静态页面 模块+分隔符+控制器(首字母大写)+方法(首字母大写)例: model-ControllerAction
 if(sizeof($contrArr)==1){
  $controller = ucfirst($controller);
 }
 $access = $mod . $controller . ucfirst($this->action->id);
 //验证访问页面地址是否在总是允许列表里面,是返回有权限
 if (in_array($access, $this->allowedAccess())) {
  return true;
 }
 //验证SRBAC有无安装,没在安装,返回的权限访问
 if (!Yii::app()->getModule('srbac')->isInstalled()) {
  return true;
 }
 //验证SRBAC有无开启,没在开启,返回的权限访问
 if (Yii::app()->getModule('srbac')->debug) {
  return true;
 }
  // 权限验证
 if (!Yii::app()->user->checkAccess($access) || Yii::app()->user->isGuest) {
  $this->onUnauthorizedAccess();
 } else {
  return true;
 }
}

4. CDbAuthManager读取当前用户角色

public function getAuthAssignments($userId)
{
  $rows=$this->db->createCommand()
    ->select()
    ->from($this->assignmentTable)
    ->where('userid=:userid', array(':userid'=>$userId))
    ->queryAll();
  $assignments=array();
  foreach($rows as $row)
  {
    if(($data=@unserialize($row['data']))===false)
      $data=null;
    $assignments[$row['itemname']]=new CAuthAssignment($this,$row['itemname'],$row['userid'],$row['bizrule'],$data);
  }
  return $assignments;
}

5. CDbAuthManager读取角色对应权限

public function getAuthItem($name)
{
  $row=$this->db->createCommand()
    ->select()
    ->from($this->itemTable)
    ->where('name=:name', array(':name'=>$name))
    ->queryRow();
  if($row!==false)
  {
    if(($data=@unserialize($row['data']))===false)
      $data=null;
    return new CAuthItem($this,$row['name'],$row['type'],$row['description'],$row['bizrule'],$data);
  }
  else
    return null;
}

6. CDbAuthManager读取权限对应操作

protected function checkAccessRecursive($itemName,$userId,$params,$assignments)
{
  if(($item=$this->getAuthItem($itemName))===null)
    return false;
  Yii::trace('Checking permission "'.$item->getName().'"','system.web.auth.CDbAuthManager');
  if(!isset($params['userId']))
    $params['userId'] = $userId;
  if($this->executeBizRule($item->getBizRule(),$params,$item->getData()))
  {
    if(in_array($itemName,$this->defaultRoles))
      return true;
    if(isset($assignments[$itemName]))
    {
      $assignment=$assignments[$itemName];
      if($this->executeBizRule($assignment->getBizRule(),$params,$assignment->getData()))
        return true;
    }
    $parents=$this->db->createCommand()
      ->select('parent')
      ->from($this->itemChildTable)
      ->where('child=:name', array(':name'=>$itemName))
      ->queryColumn();
    foreach($parents as $parent)
    {
      if($this->checkAccessRecursive($parent,$userId,$params,$assignments))
        return true;
    }
  }
  return false;
}

7. CAuthManager验证权限

public function executeBizRule($bizRule,$params,$data)
{
  return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval($bizRule)!=0 : @eval($bizRule)!=0);
}

8. 总是充许访问规则设置

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP安装攻略:常见问题解答(二)
Oct 09 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
PHP遍历XML文档所有节点的方法
Mar 12 PHP
php安装swoole扩展的方法
Mar 19 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
PHP连接sftp并下载文件的方法教程
Aug 26 PHP
PHP智能识别收货地址信息实例
Jan 05 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
Yii视图操作之自定义分页实现方法
Jul 14 #PHP
全面解析PHP操作Memcache基本函数
Jul 14 #PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 #PHP
Yii中的relations数据关联查询及统计功能用法详解
Jul 14 #PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 #PHP
Yii实现Command任务处理的方法详解
Jul 14 #PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
Jul 14 #PHP
You might like
PHP 身份验证方面的函数
2009/10/11 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
整理Python最基本的操作字典的方法
2015/04/24 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
python实现加密的方式总结
2020/01/19 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
Python之字典添加元素的几种方法
2020/09/30 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
警察思想汇报
2014/01/04 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
疾病捐款倡议书
2014/05/13 职场文书
工程服务质量承诺书
2015/04/29 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
党员转正介绍人意见
2015/06/03 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
Nginx配置Https安全认证的实现
2021/05/26 Servers