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 相关文章推荐
ip签名探针
Oct 09 PHP
复杂检索数据并分页显示的处理方法
Oct 09 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
深入file_get_contents与curl函数的详解
Jun 25 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
详解PHP中的PDO类
Jul 06 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP浮点比较大小的方法
Feb 14 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 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 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
Python连接PostgreSQL数据库的方法
2016/11/28 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
Python开发的实用计算器完整实例
2017/05/10 Python
python书籍信息爬虫实例
2018/03/19 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Python二元赋值实用技巧解析
2019/10/25 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
软件测试英文面试题
2012/10/14 面试题
学校后勤岗位职责
2014/02/19 职场文书
黄金酒广告词
2014/03/21 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
mysql部分操作
2021/04/05 MySQL