不积跬步无以至千里

记录精彩的程序人生

  • 首页
  • Java
  • Golang
  • PHP
  • Python
  • Nodejs
  • Lua
  • Docker
  • DevOps
  • 文章归档
  • 默认分类
  • 关于
  • 标签

  • 搜索
PostgreSQL hbase 时间同步 nexus 开机启动 nexus, 开机启动 jenkins安装配置 gitlab安装配置 gitlab安装 文件系统 fastdfs gcc切换 gcc升级 mysql8 交换空间 虚拟内存 tcp thrift lua tag test VPN SoftEtherVPN homebrew asm spring tomcat maven jdk ios mac 图案字符 figlet mysql半同步复制 mysql主从同步 一主多从 一主一从 主从同步 反向代理 密码重置 test 虚拟机扩容 swap 虚拟空间 docker ldocker grpc-gateway protobuf 微服务 go grp GRPC 授权登录 OAuth2.0 SOA supervisord supervisor RPC CentOS rabbitmq 环境变量 php-fpm php.ini error php7 lnmp 编译安装 mysql nginx linux java php python redis 字符串操作 mysql5.7 Solo

Yii中利用filters来控制访问

发表于 2020-08-19 | 分类于 默认分类 | 0 | 阅读次数 1277

filters()方法定义在CController里,用Gii生成Controller时里面就有filters方法,代码如下:

01 public function filters()
02 {
03 // return the filter configuration for this controller, e.g.:
04 return array(
05 'inlineFilterName',
06 array(
07 'class'=>'path.to.FilterClass',
08 'propertyName'=>'propertyValue',
09 ),
10 );
11 }

这个方法没有做什么实质性的动作,它只是把你将要执行的过滤方法方法名或者过滤类的类名返回给CController。 我们先看使用方法的方式,也即上面代码里的’inlineFilterName’含义,这个inlineFilterName意思是在当前控制器的类中有 一个inlineFilterName()方法,该方法里就是你要执行的过滤规则,比如:当前在TestController里:

01 <?php
02 class TestController extends CController{
03 //该方法判断用户是否登录
04 public function filterInlineFilterName($filterChain){
05 if (Yii::app()->user->isGuest)
06 Yii::app()->user->loginRequired();//封装了登录的url
07 $filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。
08 }
09 filters(){
10 return array('inlineFilterName'),
11 }
12 }
13
14 ?>
Ok,上面的代码就是对当前控制器的所有action都执行了检查用户是否登录了操作,如果用户未登录则跳转到登录页,如果登录则继续执行action里的内容。这是利用在当前控制器下写方法的方式执行过滤,同样,写成类也是可以的,引入方式
01 public function filters()
02 {
03 // return the filter configuration for this controller, e.g.:
04 return array(
05 array(
06 'class'=>'path.to.FilterClass',//类名
07 'propertyName'=>'propertyValue',//属性名,属性值
08 ),
09 );
10 }
那可能有的哥们要问了,那要是我想让特定的方法检查是否登录了怎么做呢?下面就是我要说的了,同样,还是在TestController里:
01 <?php
02 class TestController extends CController{
03 //该方法判断用户是否登录
04 public function filterInlineFilterName($filterChain){//必须以filter开头,后跟名字
05 if (Yii::app()->user->isGuest && !in_array($filterChain->action->id,$this->inlineFilterNameAction()))
06 Yii::app()->user->loginRequired();//封装了登录的url
07 $filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。
08 }
09 public function filters(){
10 return array('inlineFilterName'),
11 }
12 public function inlineFilterNameAction(){//返回要执行过滤的action
13 return array('action1','action2','action3');
14 }
15 }
16
17 ?>
这样就可以做到对指定的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()方法的写法:
01 public function accessRules(){
02 return array(
03 'allow', // or 'deny'
04 //可选规则,本规则适用于列出的所有动作ID(不区分大小写)
05 //如果未指定此项,则规则适用于所有动作。
06 'actions'=>array('edit', 'delete'),
07 //可选规则,本规则适用于列出的所有控制器ID(不区分大小写)
08 'controllers'=>array('post', 'admin/user'),
09 //可选规则,本规则适用于列出的所有用户ID(不区分大小写)
10 //使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。
11 'users'=>array('thomas', 'kevin'),
12 //可选规则,本规则适用于列出的所有角色(区分大小写)。
13 'roles'=>array('admin', 'editor'),
14 //可选规则,本规则适用于列出的所有IP地址。
15 //如127.0.0.1, 127.0.0.*
16 'ips'=>array('127.0.0.1'),
17 //可选规则,本规则适用于列出的所有请求类型(区分大小写)。
18 'verbs'=>array('GET', 'POST'),
19 //可选规则,一个PHP表达式,其值表示此规则是否适用
20 'expression'=>'!$user->isGuest && $user->level==2',
21 //可选规则,显示自定义的错误消息
22 //自1.1.1版后,此选项开始使用。
23 'message'=>'Access Denied.',
24 )
25
26 }
好了,这下对Yii的过滤规则大家了解了吧?试着写写吧
yii中创建自己的widget方法
关于产品经理的四点思考
  • 文章目录
  • 站点概览
ken

ken

记录精彩的程序人生

498 日志
9 分类
77 标签
RSS
Creative Commons
Links
  • 酷壳
0%
© 2010 — 2025 ken
由 Halo 强力驱动
鄂ICP备18013899号-1