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

主要参考资料: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

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

  1. yii 权限分级式访问控制的实现(非RBAC法)——已验证

    验证和授权——官方文档: http://www.yiichina.com/guide/topics.auth http://www.yiiframework.com/doc/guide/1.1/zh_ ...

  2. YIi 权限管理和基于角色的访问控制

    验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...

  3. Spring Security实现基于RBAC的权限表达式动态访问控制

    昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...

  4. Nagios ’status.cgi‘文件权限许可和访问控制漏洞

    漏洞名称: Nagios ’status.cgi‘文件权限许可和访问控制漏洞 CNNVD编号: CNNVD-201307-013 发布时间: 2014-02-21 更新时间: 2014-02-21 危 ...

  5. OpenSSH ‘mm_newkeys_from_blob’函数权限许可和访问控制漏洞

    漏洞名称: OpenSSH ‘mm_newkeys_from_blob’函数权限许可和访问控制漏洞 CNNVD编号: CNNVD-201311-117 发布时间: 2013-11-12 更新时间: 2 ...

  6. php正則表達式中的非贪婪模式匹配的使用

    php正則表達式中的非贪婪模式匹配的使用 通常我们会这么写: $str = "http://www.baidu/.com? url=www.sina.com/"; preg_mat ...

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

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  8. 权限管理系统(五):RBAC新解,基于资源的权限管理

    本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的.同时我将讨论一种我认为更好的权限管理方式. 1.什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念.角色是 ...

  9. 权限管理系统(四):RBAC权限模型分类介绍

    RBAC是Role-BasedAccess Control的英文缩写,意思是基于角色的访问控制.RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,who.what.how构 ...

随机推荐

  1. iOS从生成证书到打包上架-02(详细2016-10最新)

    由于篇幅的限制,这篇接着上一篇(关于证书)写的,有需要的小伙伴可以先阅读上一篇 2.在App Store创建应用 1.回到Account,点击iTunes Connect 2.点击我的App 3.点击 ...

  2. iframe框架自适应高度 uncanght SecurityError: Blocked a frame with origin "null" from accessing a frame ....

    来源于crm项目的contact/edit.html 一.背景是这样的 最近在做crm系统的前端页面,有一个页面呢,点击“查看全部信息”时会弹出,这个弹窗里面又有分页导航,分页不是使用ajax 异步刷 ...

  3. C链表反转(时间复杂度O(n))

    面试的时候经常会出现的问题,现在都做一遍,回忆一下,练练手. 这个题目需要注意两点: 1.head->next 要先设置为NULL ,否则反转后,它还是指向之前的next节点 2.需要有一个tm ...

  4. mybatis generator 使用

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  5. css z-index详解

    写css z-index的时候经常会出现很多莫名其妙的问题,下面对z-index属性做彻底的剖析,本文参考了<一个css中z-index的用法>,并做了很多demo,方便了解z-index ...

  6. PERCONA-TOOLKIT 工具的安装与使用2

    [root@server-mysql ~]# cd /usr/bin [root@server-mysql bin]# ls pt* pt-align pt-duplicate-key-checker ...

  7. QT运行时加载UI文件

      写QT程序里运行时加载UI文件,代码如下: 点击(此处)折叠或打开 #include "keyboard.h" #include <QtUiTools> #incl ...

  8. Spring – Sending E-Mail Via Gmail SMTP Server With MailSender--reference

    Spring comes with a useful ‘org.springframework.mail.javamail.JavaMailSenderImpl‘ class to simplify ...

  9. Android应用程序所包含的四种组件和DDMS

    关注用户组件         Activity                               编辑文本 .玩游戏 后台进程               Service           ...

  10. Linux启动遇到的问题

    双系统装的Ubuntu,在一次意外关机后无法进入图形界面,每次输入完密码进入桌面后又会退到密码输入界面.使用命令行df -hl查看发现根目录使用率达到100%.推测是因为意外关机导致的,但是找不到应该 ...