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 相关文章推荐
javascript 小型动画组件与实现代码
Jun 02 PHP
PHP 中检查或过滤IP地址的实现代码
Nov 27 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
PHP实现多图片上传类实例
Jul 26 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
Zend Studio使用技巧两则
Apr 01 PHP
thinkPHP中volist标签用法示例
Dec 06 PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 PHP
PHP crc32()函数讲解
Feb 14 PHP
WordPress伪静态规则设置代码实例
Dec 10 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 14 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/07/30 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
jQuery之网页换肤实现代码
2011/04/30 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
2019/01/08 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
Python for循环中的陷阱详解
2018/07/13 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
Python异常处理例题整理
2019/07/07 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
机械工程师求职自我评价
2013/09/23 职场文书
大学生秋游活动方案
2014/02/17 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
宣传标语大全
2014/07/01 职场文书
农村门前三包责任书
2014/07/25 职场文书
招标保密承诺书
2015/01/20 职场文书
补充协议书
2015/01/28 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android