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即登陸用戶。

相關文章
相關標籤/搜索