深入解析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 相关文章推荐
mysql 字段类型说明
Apr 27 PHP
PHP mkdir()定义和用法
Jan 14 PHP
PHP 组件化编程技巧
Jun 06 PHP
PHP实现异步调用方法研究与分享
Oct 27 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
php+mysqli数据库连接的两种方式
Jan 28 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
PHP中的流(streams)浅析
Jul 02 PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
Yii框架实现图片上传的方法详解
May 20 PHP
Laravel框架实现简单的学生信息管理平台案例
May 07 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中socket的用法详解
2014/10/24 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
Python中的Matplotlib模块入门教程
2015/04/15 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
python requests.get带header
2020/05/05 Python
浅析Python迭代器的高级用法
2020/07/16 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
小学英语教师先进事迹
2014/05/28 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
微笑服务标语
2014/06/24 职场文书
就业协议书
2014/09/12 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
考研复习计划
2015/01/19 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
化工生产实习心得体会
2016/01/22 职场文书