Yii中利用filters来控制访问
filters()方法定义在CController里,用Gii生成Controller时里面就有filters方法,代码如下:
public function filters()
{
// return the filter configuration for this controller, e.g.:
return array(
'inlineFilterName',
array(
'class'=>'path.to.FilterClass',
'propertyName'=>'propertyValue',
),
);
}
这个方法没有做什么实质性的动作,它只是把你将要执行的过滤方法方法名或者过滤类的类名返回给CController。 我们先看使用方法的方式,也即上面代码里的’inlineFilterName’含义,这个inlineFilterName意思是在当前控制器的类中有 一个inlineFilterName()方法,该方法里就是你要执行的过滤规则,比如:当前在TestController里:
<?php
class TestController extends CController{
//该方法判断用户是否登录
public function filterInlineFilterName($filterChain){
if (Yii::app()->user->isGuest)
Yii::app()->user->loginRequired();//封装了登录的url
$filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。
}
public function filters(){
return array('inlineFilterName');
}
}
?>
Ok,上面的代码就是对当前控制器的所有action都执行了检查用户是否登录了操作,如果用户未登录则跳转到登录页,如果登录则继续执行action里的内容。这是利用在当前控制器下写方法的方式执行过滤,同样,写成类也是可以的,引入方式
public function filters()
{
// return the filter configuration for this controller, e.g.:
return array(
array(
'class'=>'path.to.FilterClass',//类名
'propertyName'=>'propertyValue',//属性名,属性值
),
);
}
那可能有的哥们要问了,那要是我想让特定的方法检查是否登录了怎么做呢?下面就是我要说的了,同样,还是在TestController里:
<?php
class TestController extends CController{
//该方法判断用户是否登录
public function filterInlineFilterName($filterChain){//必须以filter开头,后跟名字
if (Yii::app()->user->isGuest && !in_array($filterChain->action->id,$this->inlineFilterNameAction()))
Yii::app()->user->loginRequired();//封装了登录的url
$filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。
}
public function filters(){
return array('inlineFilterName'),
}
public function inlineFilterNameAction(){//返回要执行过滤的action
return array('action1','action2','action3');
}
}
?>
这样就可以做到对指定的action添加自定义的过滤规则了。
其实,Yii里已经封装好了一个过滤类,这里带大家看看它是怎样实现的,其实原理和上面一模一样。我们先来看看CController里的public void filterAccessControl(CFilterChain $filterChain) 方法:
public function filterAccessControl($filterChain)
{
$filter=new CAccessControlFilter;
$filter->setRules($this->accessRules());
$filter->filter($filterChain);
}
可以看到,它是以filter开头的函数,大家知道它是干嘛的了吧?该方法实例化了一个CAccessControlFilter类,该类就是处理过滤规则的,然后把$this->accessRules()作为一个参数付给 $filter->setRules()方法。 下面来看看accessRules()方法的写法:
public function accessRules()
{
return array(
'allow', // or 'deny'
//可选规则,本规则适用于列出的所有动作ID(不区分大小写)
//如果未指定此项,则规则适用于所有动作。
'actions' => array('edit', 'delete'),
//可选规则,本规则适用于列出的所有控制器ID(不区分大小写)
'controllers' => array('post', 'admin/user'),
//可选规则,本规则适用于列出的所有用户ID(不区分大小写)
//使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。
'users' => array('thomas', 'kevin'),
//可选规则,本规则适用于列出的所有角色(区分大小写)。
'roles' => array('admin', 'editor'),
//可选规则,本规则适用于列出的所有IP地址。
//如127.0.0.1, 127.0.0.*
'ips' => array('127.0.0.1'),
//可选规则,本规则适用于列出的所有请求类型(区分大小写)。
'verbs' => array('GET', 'POST'),
//可选规则,一个PHP表达式,其值表示此规则是否适用
'expression' => '!$user->isGuest && $user->level==2',
//可选规则,显示自定义的错误消息
//自1.1.1版后,此选项开始使用。
'message' => 'Access Denied.',
);
}
好了,这下对Yii的过滤规则大家了解了吧?试着写写吧
Yii中利用filters来控制访问的更多相关文章
- 在ASP.NET MVC3 中利用Jsonp跨域访问
在ASP.NET MVC3 中利用Jsonp跨域访问 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复 ...
- (转)在ASP.NET MVC3 中利用Jsonp跨域访问
原文地址:http://www.cnblogs.com/skm-blog/p/3431999.html 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用 ...
- yII中利用urlManager将URL改写成restful风格 这里主要涉及url显示样式
1.打开config文件夹下面的mian.php 2.修改内容 如把地址http://www.test.com/index.php?r=site/page/sid/1修改为http://www ...
- YII中利用urlManager将URL改写成restful风格
这里主要涉及url显示样式 1.打开config文件夹下面的mian.php 2.修改内容 如把地址http://www.test.com/index.php?r=site/page/sid/ ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
- Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:
Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...
- Yii中使用RBAC完全指南
开始准备 Yii提供了强大的配置机制和很多现成的类库.在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码.所以准备工作就是,打开编辑器,跟我来.设置参数.建立数据库 在配置数组中,增加以下内 ...
- yii中缓存(cache)详解
缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: 1 ...
- yii中缓存(cache)详解 - 彼岸あ年華ツ
缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成 这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: ...
随机推荐
- HDU 2553 状态压缩
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- DBMS_LOB的简单用法以及释放DBMS_LOB生成的临时CLOB内存
dbms_lob包(一) dbms_lob包(二) 如何释放DBMS_LOB.CREATETEMPORARY的空间 Temporary LOB导致临时表空间暴满. oracle数据库中的大对象1——永 ...
- 简话Angular 00 为什么要学Angular
一句话: 现在不学Angular的结局,就和5年前不学JQuery一样! 谁学谁知道,早学早进阶! 1. JQuery vs Javascipt 问两个问题: 1) 你用过JQuery吗?当然! 2) ...
- Qt enum使用总结
一.enum 自省 const QMetaObject &mo = [ClassName]::staticMetaObject; int index = mo.indexOfEnumerato ...
- Linux DMA Engine framework(2)_功能介绍及解接口分析
http://www.wowotech.net/linux_kenrel/dma_engine_api.html 补充 http://www.zhimengzhe.com/linux/259646.h ...
- GPU编程自学7 —— 常量内存与事件
深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...
- Leetcode 1022. Sum of Root To Leaf Binary Numbers
dfs class Solution: def sumRootToLeaf(self, root: TreeNode) -> int: stack=[(root,0)] ans=[] bi_st ...
- batchsize的选择
参考链接:http://www.zhihu.com/question/32673260 其中链接中提到,theano Python接口,支持RBM,DBN,MLP...等
- Swapping eth0 and eth1 on OK335xS board
/******************************************************************************* * Swapping eth0 and ...
- (译)KVO的内部实现
09年的一篇文章,比较深入地阐述了KVO的内部实现. KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模 ...