Yii 权限分级式访问控制实现(非RBAC法)

以下由我们在信易网络公司开发项目的时候终结出的一些经验

主要参考资料:yii官网http://www.yiiframework.com/wiki/60/

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(‘*‘),
       
// *号标识所有用户包括注册的、没注册的、一般的、管理员级的 
   
       
), 
       
    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 组件代码:

<?php
 
class WebUser
extends CWebUser {
  private
$_model;
 
  function
getFirst_Name(){
    $user =
$this->loadUser(Yii::app()->user->id);
   
return $user->first_name;
  }
 
function isAdmin(){
    $user =
$this->loadUser(Yii::app()->user->id);
   
if ($user==null)
       
return 0;
   
else
        return
$user->role == "管理员";
  }
 
protected function loadUser($id=null)
   
{
       
if($this->_model===null)
       
{
           
if($id!==null)
               
$this->_model=User::model()->findByPk($id);
       
}
        return
$this->_model;
   
}
}
?>

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

本文由专注于成都网站建设的信易网络发布,更多关于yii的信息请关注信易网络随后的发布,信易网络的官网http://www.ir58.com

时间: 2024-10-21 06:20:21

Yii 权限分级式访问控制实现(非RBAC法)的相关文章

权限分级设置

今天改权限bug琢磨了下权限分级的问题  需求: 用户需要能创建子帐号给其他人用 不能显示跟自己无关的信息 逻辑: 角色对应权限 子账户权限<=父账号 不能对自己的权限进行设置 实现: 通过读取当前用户,获取角色信息. 权限管理中隐藏当前角色,不让用户编辑. 新建角色的权限候选树根据当前角色权限生成. 新建一张表保存用户创建角色情况. 新建一张表保存角色生成用户情况. 取数据时递归查询,以用户为条件查询用户->角色表,得到记录为0终止.

java访问控制权限和C++访问控制权限的对比

1.java修饰符权限 这里有一个包的概念,所谓同一个包是指*.java文件处于同一个文件夹下 2.C++修饰符权限 public:这是公有的成员,允许类外直接访问,当然,这要加上类作用域符::, protected:这是保护成员,只允许该类及其派生类访问 private:这是私有成员,只允许在该类中进行访问,当然,在类外只可以通过设定的公有函数进行访问. java访问控制权限和C++访问控制权限的对比

linux 特殊权限chattr(文件系统级别的权限) Attr 权限和 ACL访问控制列表 ...

Attr 权限 和 ACL 访问控制列表 Attr 权限里的 "a" 权限和 "i" 权限 a :全名append only 只允许追加数据,不允许任何用户改动文件(超级用户也不行) 甚至不能正常的删除文件 只能读取文件内容,只能用 "echo" 追加内容 chattr +a xxx #增加 a 权限 chattr -a xxx #取消 a 权限 lsattr #查看权限 [[email protected] /test]# touch abc

算法笔记_013:汉诺塔问题(Java递归法和非递归法)

目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus is possible for using animation. e.g. if n = 2 ; A→B ; A→C ; B→C; if n = 3; A→C ; A→B ; C→B ; A→C ; B→A ; B→C ; A→C; 翻译:模拟汉诺塔问题的移动规则:获得奖励的移动方法还是有可能的.

【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)

意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡.   问:一对兔子,一年能繁殖成多少对兔子?题中本质上有两类兔子:一类是能生殖的兔子,简称为大兔子:新生的兔子不能生殖,简称为小兔子:小兔子一个月就长成大兔子.求的是大兔子与小兔子的总和. 月     份  ⅠⅡ  Ⅲ  Ⅳ  Ⅴ Ⅵ  Ⅶ  Ⅷ Ⅸ Ⅹ  Ⅺ  Ⅻ大兔对数 1  1   2   3   5  8  13  21 34 55 

yii权限rbac验证三张表字段说明

auth_items:功能 用来记录RBAC中的对象. 字段: name - 存放对象名称,字符串: type - 对象类型,(0, 1, 2): description - 相关的描述,长字符串: bizrule -长字符串,可以在这里定义一个PHP的代码块,以增强验证的扩展性: data -长字符串,序列化后的数组.用于给bizrule提供参数: 其中 type 字段的值含义为 0 - Operation 操作1 - Task 任务2 - Role 角色 auth_assignments :

权限及文件访问控制

首先,还是要从用户账户的作用出发: 用户账户的作用:证实操作者的身份 不允许任何人都以管理的身份来对计算机资源进行使用,这样会使计算机的安全性特别低. 其次,用户账户通过之后,我们要对于不同的用户账户进行不同的授权(权限) 例如:超级用户(root),拥有对于计算机的资源拥有所有权 普通账户(user1,user2,...),拥有指定赋予的权限. 文件系统的权限管理: 普通权限 特殊权限 文件的扩展属性 FACL(文件系统访问控制列表) 我们把这4个部分组成的一套体系称为:DAC(自主访问控制)

用户和组管理权限及文件访问控制

与用户账户和组帐户相关的文件: 1./etc/passwd 2./etc/group 3./etc/shadow 4./etc/gshadow 5./etc/default/useradd 6./etc/login.defs 7./etc/skel(Directory) 1./etc/passwd: root:x:0:0:root:/root:/bin/bash 1  2 3 4  5   6    7 1:用户账户登录名称: 2:使用"x"表示密码占位符: 3:用户账户的UID: 4

登录式shell和非登录式shell

在用户的角度,SHELL的类型有两种: 登录式shell: 正常通过某客户端登录 su - USERNAME  或  su -l USERNAME 非登录式shell: su USERNAME 图形终端下打开的命令窗口 自动执行的shell脚本 bash的配置文件: 全局配置: /etc/profile     , /etc/profile.d/*.sh    ,    /etc/bashrc 个人配置: ~/.bash_profile,    ~/.bashrc  profile类的文件: 设