深入解析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中的登陆login
Jan 18 PHP
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
php上传文件的增强函数
Jul 21 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
理清PHP在Linxu下执行时的文件权限方法
Jun 07 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
Jun 08 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
php 截取中英文混合字符串的方法
May 31 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使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
js分页工具实例
2015/01/28 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
python 实现在Excel末尾增加新行
2018/05/02 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
详解Python3 pickle模块用法
2019/09/16 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
什么是serialVersionUID
2016/03/04 面试题
路政管理专业个人自荐信范文
2013/11/30 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
历史学专业求职信
2014/06/19 职场文书
道歉的话语大全
2015/05/12 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers