深入解析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下实现折线图效果的代码
Apr 28 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 PHP
在Windows XP下安装Apache+MySQL+PHP环境
Feb 22 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 PHP
Symfony控制层深入详解
Mar 17 PHP
PHP框架Laravel插件Pagination实现自定义分页
Apr 22 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
详解php中的implements 使用
Jun 13 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
Aug 28 PHP
php压缩文件夹最新版
Jul 18 PHP
浅谈如何提高PHP代码的质量
May 28 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
用PHP制作的意见反馈表源码
2007/03/11 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
jquery easyui使用心得
2014/07/07 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
Python数据处理numpy.median的实例讲解
2018/04/02 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
python exit出错原因整理
2020/08/31 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
自荐书模板
2013/12/15 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
体育活动总结范文
2014/05/04 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
酒店宣传语大全
2015/07/13 职场文书
教师病假条范文
2015/08/17 职场文书