深入解析yii权限分级式访问控制的实现(非RBAC法)


Posted in PHP onJune 13, 2013

yii framework 提供了2套权限访问系统,一套是简单的filter(过滤器)模式,另一套是复杂全面的RBAC模式,我这里要讲的是第一套(因为我也刚刚学到这里)。如 果你有研究过YII官方的demo blog,一定知道,比如,由gii自动生成的user模块,自动附带了简单的filter权限分配功能,具体细节请参照blog手册的“用户验证”一章 节,以及yii官方指南的“验证和授权”一章节。(注意,我这里所指的模块,只是我个人对与user有关的文件的统称,与yii文件系统的模块 (module)含义不同。)
关于权限分配的文件大多在controllers里,比如打开UserController.php文件你会看到2个类函数。

public function filters() 
     { 
      return array( 
       'accessControl',               // 实现CRUD操作的访问控制。 
       'postOnly + delete', 
         ); 
     }  public function accessRules()              //这里就是访问规则的设置。 
     { 
      return array( 
         array('allow',              // 允许所有用户执行index,view动作。 
           'actions'=>array('index','view'), 
           'users'=>array('*'), <span></span>           
           ),                    
         array('allow',             // 只允许经过验证的用户执行create, update动作。 
            'actions'=>array('create','update'), 
            'users'=>array('@'),       // @号指所有注册的用户 
             ), 
         array('allow',             // 只允许用户名是admin的用户执行admin,delete动作 
             'actions'=>array('admin','delete'), 
             'users'=>array('admin'), 
             ),                   //admin就是指用户名是admin的用户,以硬编码的形式分配用户权限。 
             array('deny',           // 拒绝所有的访问。 
             'users'=>array('*'), 
             ), 
         ); 
     }

关于更多的访问规则的设定请参照官方文件http://www.yiiframework.com/doc/api/1.1/CAccessControlFilter
好了,现在要开始按照我们自己的需求设置适合自己的权限分配了。我们希望filter访问控制模式能更完美一点,按照常识,我们希望它能按照数据库里user表里不同级别用户,实行不同的授权,而不是用硬编码的形式控制。

回到demo blog,我先对数据库的tbl_user表做修改,在原来的基础上加上role一项。对原来的用户信息记录添加role的value为"管理员"或"一般用户"。
然后依次执行以下3个步骤:
1. 创建组件WebUser,它是对CWebUser的扩展。
2. 修改config/main.php文件。
3.修改accessRules()。
具体细节如下:
1.WebUser.php 组件代码:

<strong><?php  // this file must be stored in: 
 // protected/components/WebUser.php 
 class WebUser extends CWebUser { 
   // Store model to not repeat query. 
   private $_model; 
   // Return first name. 
   // access it by Yii::app()->user->first_name 
   function getFirst_Name(){ 
     $user = $this->loadUser(Yii::app()->user->id); 
     return $user->first_name; 
   } 
   // This is a function that checks the field 'role' 
   // in the User model to be equal to 1, that means it's admin 
   // access it by Yii::app()->user->isAdmin() 
   function isAdmin(){ 
     $user = $this->loadUser(Yii::app()->user->id); 
     if ($user==null) 
         return 0; 
     else 
         return $user->role == "管理员"; 
   } 
   // Load user model. 
   protected function loadUser($id=null) 
     { 
         if($this->_model===null) 
         { 
             if($id!==null) 
                 $this->_model=User::model()->findByPk($id); 
         } 
         return $this->_model; 
     } 
 } 
 ?></strong>

2.在config/main.php找到如下代码,添加标红色的代码。
   'components'=>array(
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
             'class'=>'WebUser',
        ),

3.找到需要更改权限的controller类,对accessRules()函数做修改,比如对前文的accessRules()函数做如下修改:
public function accessRules()  //这里就是访问规则的设置。     { 
     return array( 
         array('allow',                     // 允许所有用户执行index,view动作。 
             'actions'=>array('index','view'), 
             'users'=>array('*'),         //*号标识所有用户包括注册的、没注册的、一般的、管理员级的 
         ), 
         array('allow',                      // 只允许经过验证的用户执行create, update动作。 
             'actions'=>array('create','update'), 
             'users'=>array('@'),       // @号指所有注册的用户 
         ), 
         array('allow',                     // 只允许用户名是admin的用户执行admin,delete动作 
             'actions'=>array('admin','delete'), 
             'expression'=>'yii::app()->user->isAdmin()', 
             //这样只有标识为“管理员”的用户才能访问admin,delete动作 
         ), 
         array('deny',  // 拒绝所有的访问。 
             'users'=>array('*'), 
         ), 
     );

工作完成!
PHP 相关文章推荐
新版PHP极大的增强功能和性能
Oct 09 PHP
PHP学习之PHP表达式
Oct 09 PHP
一个简单的MySQL数据浏览器
Oct 09 PHP
php 获取本地IP代码
Jun 23 PHP
关于js与php互相传值的介绍
Jun 25 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
PHP中array_keys和array_unique函数源码的分析
Feb 26 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
May 20 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
Jun 13 #PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 #PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
Jun 13 #PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 #PHP
深入php socket的讲解与实例分析
Jun 13 #PHP
PHP数据类型的总结分析
Jun 13 #PHP
如何用C语言编写PHP扩展的详解
Jun 13 #PHP
You might like
怎样辨别一杯好咖啡
2021/03/03 新手入门
php更新mysql后获取改变行数的方法
2014/12/25 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
php与js的区别是什么
2013/08/05 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
Vue组件通信的四种方式汇总
2018/02/08 Javascript
详解vue添加删除元素的方法
2018/06/30 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
python 串口读取+存储+输出处理实例
2019/12/26 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
如何客观的进行自我评价
2013/12/17 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
办公设备采购方案
2014/03/16 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
2014年党员整改措施
2014/10/24 职场文书
安全承诺书格式范本
2015/04/28 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android