深入解析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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
php 常用类汇总 推荐收藏
May 13 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
Aug 20 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
PHP中类的继承和用法实例分析
May 24 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
浅谈php://filter的妙用
Mar 05 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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记录日志的实现代码
2011/08/08 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
Javascript !!的作用
2008/12/04 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
angular.bind使用心得
2015/10/26 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
详解Python3中yield生成器的用法
2015/08/20 Python
使用Python生成XML的方法实例
2017/03/21 Python
python3实现随机数
2018/06/25 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
python实现多线程端口扫描
2019/08/31 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
python实现一个猜拳游戏
2020/04/05 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
大学生社会实践自我鉴定
2014/03/24 职场文书
运动会稿件100字
2014/09/24 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
入党转正介绍人意见
2015/06/03 职场文书
安全生产标语口号
2015/12/26 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP