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基础知识:函数基础知识
Dec 13 PHP
php比较多维数组中值的大小排序实现代码
Sep 08 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
ThinkPHP3.1新特性之字段合法性检测详解
Jun 19 PHP
php按单词截取字符串的方法
Apr 07 PHP
PHP制作用户注册系统
Oct 23 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 PHP
PHP实现页面静态化深入讲解
Mar 04 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模板,主要想体现一下思路
2006/12/25 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
简单介绍Python中的struct模块
2015/04/28 Python
八大排序算法的Python实现
2021/01/28 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Django web框架使用url path name详解
2019/04/29 Python
python操作excel让工作自动化
2019/08/09 Python
wxPython实现画图板
2020/08/27 Python
python中的逆序遍历实例
2019/12/25 Python
C#如何进行LDAP用户校验
2012/11/21 面试题
大三学生入党思想汇报
2014/01/02 职场文书
打架检讨书800字
2014/01/10 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
中小学生学籍证明
2014/10/25 职场文书
求职自荐信怎么写
2015/03/04 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP