zoukankan      html  css  js  c++  java
  • YII学习第二十三天,accessRules用法

    访问控制过滤器(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即登录用户。

  • 相关阅读:
    第k小元素学习记录
    线段树学习笔记
    数论方面的知识积累
    javascript 例子
    数据绑定以及Container.DataItem的具体分析
    C#委托和事件
    C#中的特性(Attributes)(翻译)
    gridview和repeater中取得行的序号
    理解 Ajax 及其工作原理,构建网站的一种有效方法
    JS数组对象参考
  • 原文地址:https://www.cnblogs.com/yzycoder/p/4807115.html
Copyright © 2011-2022 走看看