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读取msn上的用户信息类
Dec 05 PHP
PHP 变量定义和变量替换的方法
Jul 30 PHP
第四章 php数学运算
Dec 30 PHP
PHP+MYSQL实现用户的增删改查
Mar 24 PHP
非常有用的9个PHP代码片段
Apr 06 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
Yii2汉字转拼音类的实例代码
Apr 18 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 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目录遍历函数opendir用法实例
2014/11/20 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
python打开文件并获取文件相关属性的方法
2015/04/23 Python
Python类定义和类继承详解
2015/05/08 Python
python决策树之C4.5算法详解
2017/12/20 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
Python xlwt模块使用代码实例
2020/06/10 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
ktv筹备计划书
2014/05/03 职场文书
电子专业自荐信
2014/07/01 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
仲裁协议书
2014/09/26 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
个人先进事迹总结
2015/02/26 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
大学生暑假实习总结
2015/07/13 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书