Yii2 RESTful API RateLimiter 无法正常使用

1 篇文章 0 订阅
0 篇文章 0 订阅
在学习 RESTful API 的过程中,学到 限制客户端的访问速率 的时候,一直尝试不成功
后来跟踪了一下源码,将问题解决了。


首先在要限制访问速率的Controller中重写 behaviors() 方法,在 behaviors 数组中加入了以下两个过滤器。

我们先看一下 RateLimiter 的源码:


Yii::info() 是用来打印日志的,但是默认 main.php 配置文件中只输出 warning 和 error 级别的日志,可以加多个 info 的配置。

注意:这里的 main.php 是你应用程序的目录,不是全局的。

日志的输出文件:api/runtime/logs/app.log,这里的 api 是我的应用名称,自行对应。


最后发现是:Rate limit skipped: user not logged in.  用户没登录。


但是,从认证过滤器 QueryParamAuth 的源码中可以看出,它是有将 accessToken 对应的用户的 identity 设置的,所以应该能获取到登陆用户才对的。


难道是两个过滤器的顺序问题,他们不是按照顺序执行的?所以就算 RateLimiter 在 QueryParamAuth 后面,也不一定是 QueryParamAuth 先执行,所以如果 RateLimiter 先执行了,这时候全局 app 中没有用户登录信息,所以就出错了?

思路是对的

直到我发现自定义 Controller 的父类 ActiveController 中的 behaviors() 方法,原来父类默认就设置了 RateLimiter 速率控制过滤器了,所以如果 behaviors 中的过滤器是按照顺序执行的,那么 RateLimiter 就会比 QueryParamAuth 先执行!!!


知道到了原因,就好解决了,肯定不能把父类的代码注释,这样不美观。这样做就行了:


先使用 unset 方法把父类的 RateLimiter 清除掉,后面再设置。

注意:RateLimiter 一定要在 QueryParamAuth 之后设置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值