過濾器是一段代碼,可被配置在控制器動作執行之前或之後執行。例如, 訪問控制過濾器將被執行以確保在執行請求的動作之前用戶已通過身份驗證;性能過濾器可用於測量控制器執行所用的時間。
過濾器定義:
第一:在Controller中以filter開頭的方法
<pre name="code" class="php"> //定義過濾器
public function filterMyFilterEdit($filterChain){
if(Yii::app()->user->getId() == 1){
header('Content-type:text/html;charset=utf8');
die('非法操作');
}
$filterChain->run();//繼續執行
}
我們定義了MyFilterEdit過濾器,用戶ID=1時不讓他操作,如果不是1則讓他繼續往下執行。其中的 $filterChain
(過濾器鏈)是一個 CFilterChain 的實例,裏面包含當前控制器和當前操作一些信息,也包含了當前控制器中使用了哪些過濾器。
第二:使用過濾器 重寫控制器中的filters方法。
public function filters(){
return array(
'MyFilterEdit + Edit,Add,Show', //使用自定義的方法過濾器
);
}
當前控制器的每個動作執行前都會先執行我們定義的過濾器(MyFilterEdit),用戶ID=1時不讓他操作,如果不是1則讓他繼續往下執行。
注 : ‘+’加號作用這個過濾器只對 Edit,Add,Show動作有效,比如:要執行一個delete動作我們可以定義一個過濾器 ‘isdelete + delete” 對刪除操作起作用,當執行delelte是會觸發過濾器 我們可以在過濾器裏面判斷是否有權限刪除
注:'-'號 除了。比如:’MyFilterEdit - Edit‘ 除了Edit動作之外,
如果我們只需要某個用戶執行或不執行某個動作,沒有一些業務邏輯的話可以使用Yii自帶的過濾器--->訪問控制過濾器(Access Control Filter)
使用方法:由於Yii已經爲我們定義好了所有不需要定義,直接在filters中使用AccessController
public function filters(){
return array(
'MyFilterEdit', //使用自定義的方法過濾器
'AccessControl' //使用系統自定義過濾器 需指定過濾規則 accessRules
);
}
我們需要重寫controller裏的accessRule方法來定義我們的過濾規則: //過濾規則 該過濾器的規則
public function accessRules(){
return array(
array(
'allow',//允許
'actions'=>array('index','edit'),//動作
<pre name="code" class="php"> 'ips'=>array('127.0.0.1'),//指定IP
'roles'=>array('system'),//只允許有超級管理角色的用戶訪問
'users'=>array('admin')//允許admin用戶執行index和edit動作,如果執行除index、edit之外的動作 會默認允許 所以我們需要定義一下規則 ), array( //以上規則不通過時則禁止訪問 'deny', 'users'=>array('*')//拒絕所有用戶 ), ); }
訪問時會有以下提示:
未被授權
您未被授權執行這個動作
你沒有訪問此頁面的授權.
如果您認爲此錯誤是服務器造成的,請與管理員聯繫 the webmaster.
已下是官網的規則列表:
-
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
。這個選項是在1.0.3版本里引入的。