深入解析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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
GBK的页面输出JSON格式的php函数
Feb 16 PHP
php页面缓存ob系列函数介绍
Oct 18 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
Dec 25 PHP
两种php实现图片上传的方法
Jan 22 PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
php实现的简单数据库操作Model类
Nov 16 PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
Oct 16 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 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 清除网页病毒的方法
2008/12/05 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
javascript的函数
2007/01/31 Javascript
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
javascript时区函数介绍
2012/09/14 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
浅谈js的异步执行
2016/10/18 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
美国性感内衣店:Yandy
2018/06/12 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
2014法制宣传日活动总结范文
2014/11/01 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书