yii accessRules用法

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

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

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

 

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


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

过滤器具体的受权规则经过重载控制器的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('*'),
            ),
        );
    }
}
上面设定了三个规则,每一个用个数组表示。ip

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

上面的规则这样理解:io

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

delete动做能够被admin角色的用户执行;class

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即登陆用户。

相关文章
相关标签/搜索