深入解析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 相关文章推荐
粗略计算在线时间,bug:ip相同
Dec 09 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
PHP中require和include路径问题详解
Dec 25 PHP
php随机抽奖实例分析
Mar 04 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
Yii2针对指定url的生成及图片等的引入方法小结
Jul 18 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
php pdo操作数据库示例
Mar 10 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
Mar 14 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
JavaScript实现删除电脑的关机键
2016/07/26 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
搭建vue开发环境
2018/07/19 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
python邮件发送smtplib使用详解
2020/06/16 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
简单的命令查看安装的python版本号
2020/08/28 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
实习老师个人总结的自我评价
2013/09/28 职场文书
学校个人对照检查材料
2014/08/26 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
公司董事任命书
2015/09/21 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
golang import自定义包方式
2021/04/29 Golang
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
mysql幻读详解实例以及解决办法
2022/06/16 MySQL
正则表达式基础与常用验证表达式
2022/06/16 Javascript