深入解析yii权限分级式访问控制的实现(非RBAC法)

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('*'),
         ),
     );

工作完成!

(0)

相关推荐

  • javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式

    在使用面向对象编程时,对象间的继承关系自然少不了!而原型正是实现javascript继承的很重要的一种方法! 我们首先来看以下代码: 复制代码 代码如下: function person(name, age) { this.name = name; this.age = age; } person.prototype.getInfo = function() { alert("My name is "+this.name+", and I have "+this.a

  • Oracle 10g各个帐号的访问权限、登录路径、监控状态命令查询等等

    1.帐号和口令设置 要选择用户SYS.SYSTEM.DBSNMP.SYSMAN使用相同的口令,那就选择"所有账户使用同一口令". BI用户,口令ch51*****,SCOTT用户.以上全部为同一个口令ch5******* 这里选择"使用不同的口令",分别设置用户的口令: SYS用户的口令为ORACLE SYSTEM用户的口令为MANAGER DBSNMP用户的口令为DBSNMP SYSMAN用户的口令为SYSMAN. SCOTT用户,指定用户口令为TIGER 2.登

  • Javascript编程中几种继承方式比较分析

    本文实例分析了Javascript编程中几种继承方式比较.分享给大家供大家参考,具体如下: 开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascript作为一门弱类型语言与类似java或c#之类的强型语言的继承方式有很大的区别,因而默认它就是非主流的面向对象方式,甚至竟有很多书将其描述为'非完全面向对象'语言.其实个人觉得,什么方式并不重要,重要的是是否具有面向对象的思想,说javascript不是面向对象语言的,往往都可能没有深入研究

  • Oracle 低权限数据库账户得到 OS 访问权限 提权利用

    这几天看了篇叫"Penetration: from application down to OS (Oracle)"的文档,感觉挺有意思的,文档的 大概意思就是说,如果 ORACLE 服务是用 administrator 账户启动的,你只要有一个具有 resource 和 connect 权限的数据库账户,就能利用 metasploit 的 smbrelay 功能,本地搭建一个 SMB 欺骗服务器, 来得到系统的访问权限.我本地测试了下,还真的成功了.:-) 具体的原理分析看原文吧,我

  • JavaScript继承方式实例

    复制代码 代码如下: function parent(){ this.x=10; } function child(){ var parentObj=new parent(); for(var p in parentObj)this[p]=parentObj[p]; } var childObj=new child(); alert(childObj.x); 复制代码 代码如下: function parent(){ this.x=10; } function child(){ this.par

  • C++ 的三种访问权限与三种继承方式

    三种访问权限 我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public.protected.private.要理解它们其实也很容易,看下面了一个例子. 父类: class Person { public: Person(const string& name, int age) : m_name(name), m_age(age) { } void ShowInfo() { cout << "姓名:" << m_name <&l

  • 浅析2种JavaScript继承方式

    js继承方法最主要的是2种,一种是通过原型的方式,一种是通过借用call&apply的构造函数方式. 1.原型(prototype): function Body(name,age){// 创建一个Body类 this.name = name;// 赋予基础属性name.age this.age = age; } Body.prototype.sayName =function() {// 给原型定义一个sayName的方法 console.log(this.name); } var a = n

  • 127.0.0.1无法访问,没有权限: GetObject

    解决127.0.0.1无法访问和0x800A0046 没有权限: 'GetObject'的方案 先感谢 D8-笨阿猪 D8-忘优草 D8-狼芽 的帮忙调试 ============================================ 一般,当我们在本机调试ASP动态网页时,可输入 http://localhosthttp://本地计算机名http://127.0.0.1  在当输入http://127.0.0.1时,一般机器都需要输入用户名和密码进入,这里将分两种情况: 一种是刚新建

  • Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号

    说明: 服务器操作系统:CentOS 6.x 服务器IP:192.168.21.134 实现目的: 1.在服务器上安装配置SVN服务: 2.配置SVN服务同时支持Apache的http和svnserve独立服务器两种模式访问: 3.Apache的http和svnserve独立服务器两种模式使用相同的访问权限账号. 具体操作: 一.关闭SELINUX vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉

  • 使用Cacls命令设置服务器文件访问权限

    Cacls命令使用格式如下: Cacls filename [/T] [/E] [/C] [/G user:perm] [/R user [...]] [/P user:perm [...]] [/D user [...]] Filename--显示访问控制列表(以下简称ACL): /T--更改当前目录及其所有子目录中指定文件的 ACL:/E-- 编辑 ACL 而不替换:/C--在出现拒绝访问错误时继续:/G user:perm--赋予指定用户访问权限.Perm 可以是R(读取).W(写入).C

  • JavaScript中的继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现 在面向对象的语言中,我们使用类来创建一个自定义对象.然而js中所有事物都是对象,那么用什么办法来创建自定义对象呢?这就需要用到js的原型: 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模

  • Javascript中的几种继承方式对比分析

    开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascript作为一门弱类型语言与类似java或c#之类的强型语言的继承方式有很大的区别,因而默认它就是非主流的面向对象方式,甚至竟有很多书将其描述为'非完全面向对象'语言.其实个人觉得,什么方式并不重要,重要的是是否具有面向对象的思想,说javascript不是面向对象语言的,往往都可能没有深入研究过javascript的继承方式,故特撰此文以供交流. 为何需要利用javascript实现

随机推荐