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读取IMAP邮件
Oct 09 PHP
php+mysql开源XNA 聚合程序发布 下载
Jul 13 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
Jun 28 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
php获取目标函数执行时间示例
Mar 04 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
php读取der格式证书乱码解决方法
Jun 22 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
PHP保留两位小数的几种方法
Jul 24 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,js双版本
2012/09/25 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
php中curl使用指南
2015/02/05 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
js 获取服务器控件值的代码
2010/03/05 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
react 生命周期实例分析
2020/05/18 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Pandas读取MySQL数据到DataFrame的方法
2018/07/25 Python
python实现汉诺塔算法
2021/03/01 Python
Python中is和==的区别详解
2018/11/15 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
关于逃课的检讨书
2014/01/23 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS