过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。
过滤器定义:
第一:在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版本里引入的。