深入解析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脚本的10个技巧(3)
Oct 09 PHP
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
PHP实现多图片上传类实例
Jul 26 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
PHP魔术方法__GET、__SET使用实例
Nov 25 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
PHP编写RESTful接口的方法
Feb 21 PHP
Yii框架上传图片用法总结
Mar 28 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
php7新特性的理解和比较总结
Apr 14 PHP
Laravel配置全局公共函数的方法步骤
May 09 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-fpm的两种进程管理模式详解
2013/06/03 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
input的focus方法使用
2010/03/13 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
Python中使用不同编码读写txt文件详解
2015/05/28 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
总监职责范文
2013/11/09 职场文书
营销总经理岗位职责
2014/02/02 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
离职报告格式
2014/11/04 职场文书
运动会宣传语
2015/07/13 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
Nginx动静分离配置实现与说明
2022/04/07 Servers