Yii2.0 RESTful API 如何对用户做速率限制

如何对用户做速率限制

应用场景:例如给第三方提供数据,限制第三方账号速率,不能影响到我们本体的业务。限流顾名思义就是为防止滥用。 例如,您可以限制每个用户 1 秒钟内最多调用 API 5 次。 如果在规定的时间内接收了一个用户大量的请求,将返回响应状态代码 429 (这意味着过多的请求)。

如何通过YII2做到

拓展用户认证体系,增强认证

具体操作

(1)执行YII2控制台命令创建,记得选择好yes。

php yii migrate/create add_allowance_and_allowance_updated_at_to_user

Yii2.0 RESTful API 如何对用户做速率限制_第1张图片
(2)到console文件下的migrations进行修改m190123_075732_add_allowance_and_allowance_updated_at_to_user.php

/**
 * {@inheritdoc}
 */
public function safeUp()
{
    $this->addColumn('user', 'allowance', $this->integer());
    $this->addColumn('user', 'allowance_updated_at', $this->integer());
}

/**
 * {@inheritdoc}
 */
public function safeDown()
{
    $this->dropColumn('user', 'allowance');
    $this->dropColumn('user', 'allowance_updated_at');
}

/*
// Use up()/down() to run migration code without a transaction.
public function up()
{

}

public function down()
{
    echo "m190123_075732_add_allowance_and_allowance_updated_at_to_user cannot be reverted.\n";

    return false;
}
*/

(3)执行迁移,完成后用户表会新增两个字段(用户控制速率的关键字段)

php yii migrate

Yii2.0 RESTful API 如何对用户做速率限制_第2张图片

(4)编写认证类,并继承 RateLimitInterface

我们可以通过 web.php内的查看到我们的用户类,进行拓展
Yii2.0 RESTful API 如何对用户做速率限制_第3张图片
拓展如下:

use yii\filters\RateLimitInterface;
use yii\web\IdentityInterface;
    class User extends BaseUser implements IdentityInterface, RateLimitInterface
    {
        public function getRateLimit($request, $action)
        {
            return [1, 10]; // $rateLimit requests per second(1秒一次请求)
        }
    
        public function loadAllowance($request, $action)
        {
            return [$this->allowance, $this->allowance_updated_at];
        }
    
        public function saveAllowance($request, $action, $allowance, $timestamp)
        {
            $this->allowance = $allowance;
            $this->allowance_updated_at = $timestamp;
            $this->save();
        }

(5)控制器加入behaviors实现

use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
use yii\filters\RateLimiter;

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter'] = [
        'class' => RateLimiter::className(),
        'enableRateLimitHeaders' => true,
    ];
    $behaviors['authenticator'] = [
        'class' => CompositeAuth::className(),
        'authMethods' => [
            //Http::className(),
            HttpBearerAuth::className(),
            QueryParamAuth::className(),
        ],
    ];
    //$behaviors['rateLimiter']['enableRateLimitHeaders'] = true;
    return $behaviors;
}

(6)测试验收
Yii2.0 RESTful API 如何对用户做速率限制_第4张图片
具体记录可以查看user数据表。

YII2的思路

通过阅读该业务的源代码,大致可以理解为
1)代码层:通过组件化模块加入behaviors与用户体系关联
2)逻辑层–查看组件(RateLimiter)
第一步:初始化时拿到请求和响应。
第二步:在动作之前查到用户,检查用户是否不符合速率要求,不符合直接报错。
第三步:若符合则记录到用户表数据库,添加头信息记录速率的相关信息并反馈给前端。

你可能感兴趣的:(yii2)