访问控制过滤器(Access Control Filter)
访问控制过滤器是检查当前用户是否能执行访问的controller action的初步授权模式。

这种授权模式基于用户名客户IP地址访问类型

访问控制过滤器,适用于简单的验证

需要复杂的访问控制,需要使用将要讲解到的基于角色访问控制(role-based access (RBAC))。

在控制器(controller)里重载CController::filters方法,设置访问过滤器来控制访问动作(看 Filter 了解更多过滤器设置信息)。
class PostController extends CController
{
......
public function filters()
    {
        return array(
            'accessControl',
        );
    }
}
在上面,设置的access control过滤器将应用于PostController里每个动作。

过滤器具体的授权规则通过重载控制器的CController::accessRules方法来指定。
class PostController extends CController
{
    ......
    public function accessRules()
    {
        return array(
            array('deny',
                'actions'=>array('create', 'edit'),
                'users'=>array('?'),
            ),
            array('allow',
                'actions'=>array('delete'),
                'roles'=>array('admin'),
            ),
            array('deny',
                'actions'=>array('delete'),
                'users'=>array('*'),
            ),
        );
    }
}
上面设定了三个规则,每个用个数组表示。

数组的第一个元素不是'allow'就是'deny',其他的是名-值成对形式设置规则参数的。

上面的规则这样理解:

create和edit动作不能被匿名执行;

delete动作可以被admin角色的用户执行;

delete动作不能被任何人执行。

访问规则是一个一个按照设定的顺序一个一个来执行判断的。

和当前判断模式(例如:用户名、角色、客户端IP、地址)相匹配的第一条规则决定授权的结果。

如果这个规则是allow,则动作可执行;

如果是deny,不能执行;如果没有规则匹配,动作可以执行。
 
为了确保某类动作在没允许情况下不被执行,设置一个匹配所有人的deny规则在最后,类似如下:
return array(
    // ... 别的规则...
    // 以下匹配所有人规则拒绝'delete'动作
    array('deny',
        'action'=>'delete',
    ),
);
因为如果没有设置规则匹配动作,动作缺省会被执行。
访问规则通过如下的上下文参数设置:

actions: 设置哪个动作匹配此规则。

users: 设置哪个用户匹配此规则。

此当前用户的name 被用来匹配,三种设定字符在这里可以用:
*: 任何用户,包括匿名和验证通过的用户。
?: 匿名用户。
@: 验证通过的用户。


roles: 设定哪个角色匹配此规则

这里用到了将在后面描述的role-based access control技术。

In particular, the rule is applied if CWebUser::checkAccess returns true for one of the roles.提示,用户角色应该被设置成allow规则,因为角色代表能做某些事情。

ips: 设定哪个客户端IP匹配此规则。


verbs: 设定哪种请求类型(例如:GET, POST)匹配此规则。

expression: 设定一个PHP表达式。

它的值用来表明这条规则是否适用。在表达式,你可以使用一个叫$user的变量,它代表的是Yii::app()->user。

访问规则中:
expression: 设定一个PHP表达式。它的值用来表明这条规则是否适用。在表达式,你可以使用一个叫$user的变量,它代表的是Yii::app()->user。
expression的具体用法:
class AdminController extends CController
{
  ……
    public function accessRules()
    {
        return array(
        array('allow',  //允许所有人执行'login','error','index'
                'actions'=>array('login','error','index'),
                'users'=>array('*'),
        ),
        array('allow', //允许超级管理员执行所有动作
                'actions'=>array('create','update','delete'),
                'expression'=>array($this,'isSuperAdmin'),
        ),
        array('allow',//允许普通管理员执行
                'actions'=>array('update'),
                'expression'=>array($this,'isNormalAdmin'),    //表示调用$this(即AdminController)中的isNormalAdmin方法。
        ),      
        array('deny',  // deny all users
                'users'=>array('*'),
        ),
        );
    }

//判断是否是超级管理员
    protected function isSuperAdmin($user)   //其中$user代表Yii::app()->user即登录用户。
    {
        return ($this->loadModel($user->id)->adminAdminFlag==1);
    }

//判断是否是普通管理员
    protected function isNormalAdmin($user)    //其中$user代表Yii::app()->user即登录用户。
    {
        return ($this->loadModel($user->id)->adminAdminFlag==0);
    }

public function loadModel($id)
    {
        $model=Admin::model()->findByPk((int)$id);
        if($model===null){
            throw new CHttpException(404,'页面不存在');     
        }
        return $model;
    }
}

注:其中$user代表Yii::app()->user即登录用户。

yii accessRules用法的更多相关文章

  1. YII学习第二十三天,accessRules用法

    访问控制过滤器(Access Control Filter)访问控制过滤器是检查当前用户是否能执行访问的controller action的初步授权模式. 这种授权模式基于用户名,客户IP地址和访问类 ...

  2. yii 标签用法(模板)

    yii模板中的label标签 <?php echo $form->labelEx($model,'name'); ?> 编译后: <label for="Projec ...

  3. Yii系列总结:yii 标签用法

    yii 常用标签:label标签.文本标签.error标签.textarea标签.hidden标签.password标签.url标签.radio标签.file标签.button标签.checkBox标 ...

  4. Yii ActiveRecord用法记录备忘

    ActiveRecord 使用方法 Example1 in查询 $criteria = new CDbCriteria(); $criteria->select = $select; $crit ...

  5. php-yii-form标签

    yii 标签用法(模板) (2013-08-14 17:28:19) 转载▼ 标签: it 分类: yii yii模板中的label标签 <?php echo $form->labelEx ...

  6. Yii CDbCriteria常用用法

    $criteria = new CDbCriteria;$criteria->compare('name',$this->name,true,'OR'); //like部分匹配//$cri ...

  7. yii的criteria的用法

    Yii的Active Recorder包装了很多. 特别是把SQL中 把where,order,limit,IN/not IN,like等常用短句都包含进CDbCriteria这个类中去,这样整个代码 ...

  8. yii widget使用的3个用法

    yii视图中使用的widget方式总结:常用的有3种方式:一.显示详细信息: $this->widget('zii.widgets.CDetailView', array( 'data' =&g ...

  9. Yii中的CCheckBoxColumn在widget中的用法

    'columns'=>array(        array(            'class'=>'CCheckBoxColumn',            'id'=>'us ...

随机推荐

  1. c语言函数, 函数调用及函数递归

    1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的.  函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函 ...

  2. 驱动插ring3线程执行代码

    近日有在写一个小东西 需要在内核态中运行一个WIN32程序 之前提到的插入APC可以满足部分要求 但是一到WIN7 x86平台下就崩溃了WIN7下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...

  3. 观点:BPM已经过时了?

    在这个信息爆炸的世界,业务转型通常是以数字系统和流程的方式发生. 根据Forrester的报告“软件必须丰富你的品牌”,人们要依靠这些技术实现期望的商业成果,比如品牌联系.客户服务创新.更好的产品和提 ...

  4. ServiceStack V3 版本 免费 redis的操作类

    Referencing v3 packages in New Projects If you want a new project to use ServiceStack's v3 packages ...

  5. javap查看class文件

    通过JVM编译java文件生成class字节码文件,很多时候很想用工具打开看看,目前还不清楚哪一个软件专门查看class文件的,但是通过windows下的javap命令可以查看详细的class文件 S ...

  6. AX2012自定义注释脚本开发

    废话少说,直接进入主题: 1.在类xppSource中增加一个类似的方法: eg. Source ifElse(Source _condition = '', Source _ifStatement ...

  7. XCode6.0的iOS免证书真机测试方法(MAC及黑苹果均有效)[转]

    目前在XCode上开发的iOS程序只能在模拟器Simulator中运行,如果要放到真机上测试,需要苹果官方认证的开发者账号,购买开发者证书iDP,99美金一年啊!!! 作为刚开始学习iOS编程的菜鸟, ...

  8. python 笔记2:python语法基础

    python语法学习笔记: 1 输入输出 input(),print(). name = input('input your name : ')print('hello ,'+name)print(& ...

  9. 查看数据库中没有进行comment的字段

    为落实数据库规范,既每个表字段都需要有comment注释,所以需要过滤生产表中没有comment的字段,搜索出还不错的过滤语句 show full columns from table where C ...

  10. NSLOG打印不全的问题

    #ifdef DEBUG #define NSLog(FORMAT, ...) fprintf(stderr, "%s:%zd\t%s\n", [[[NSString string ...