2.8. 访问节流限制

未匹配的标注

节流限速 (throttling) 允许你限制客户端给定时间的访问次数。限制和过期时间是在限速器里定义的。 默认有两个限速器,验证通过限速器和未验证限速器。

改变节流限速的 key

默认节流限速是绑定客户 ip 地址的。如果需要改变这个默认行为,你可以注册你自己的解决者,它应该返回一个字符串用于节流限速器。

app('Dingo\Api\Http\RateLimit\Handler')->setRateLimiter(function ($app, $request) {
    return $app['example']->getRateLimiterKey();
});

第一个参数是应用IoC容器的实例,第二个参数是被节流限速的请求实例。

启用节流限制

要为路由或路由组启用节流限制,你必须启用api.throttle中间件。 一旦启用了节流限制,你必须已经配置过了一些限制或配置过了具体的路由限制。

在所有的路由中启用节流限制

$api->version('v1', ['middleware' => 'api.throttle'], function ($api) {
    // 此版本组中的路由将需要身份认证.
});

特定路由上的节流限制

$api->version('v1', function ($api) {
    $api->get('user', ['middleware' => 'api.throttle', function () {
        // 这个路由需要验证
    }]);

    $api->get('posts', function () {
        // 这个路由不需要验证
    });
});

路由特定节流

如果只是想限制某些路由或者路由群组,可使用 limitexpires 选项。

$api->version('v1', function ($api) {
    $api->get('users', ['middleware' => 'api.throttle', 'limit' => 100, 'expires' => 5, function () {
        return User::all();
    }]);
});

以上为这个路由设置了请求限制 100 次,过期时间 5 分钟。如果你把它设置在路由群组上,那组内的每个路由具有100次请求的限制。

$api->version('v1', ['middleware' => 'api.throttle', 'limit' => 100, 'expires' => 5], function ($api) {
    $api->get('users', function () {
        return User::all();
    });

    $api->get('posts', function () {
        return Post::all();
    });
});

以上例子中单个用户可以各访问100次 /users/posts 路由。此限制不是作用于整个组的,而是作用于这个组的每个路由。

自定义阀门

你可能需要为更复杂的情况自定义阀门,为了实现,你需要满足一些条件。一个阀门必须实现 Dingo\Api\Contract\Http\RateLimit\Throttle 接口,然而,一个抽象类可以帮助我们快速上手。每一个预定义阀门继承这个抽象类。

所有的阀门都在尝试匹配给定的情况。阀门需要根据他是否匹配条件返回 truefalse。举个例子,你可能想要匹配一个指定组的认证的用户。

use Illuminate\Container\Container;
use Dingo\Api\Http\RateLimit\Throttle\Throttle;

class CustomThrottle extends Throttle
{
    public function match(Container $app)
    {
        // 在这里执行一些逻辑并根据是否返回 true 或 false
        // 你的条件与阀门匹配。
    }
}

接下来,你可以配置你的阀门。

'throttling' => [
    'custom' => new CustomThrottle(['limit' => 200, 'expires' => 10])
]

或者在你的 Lumen 启动文件中注册它。

app('Dingo\Api\Http\RateLimit\Handler')->extend(new CustomThrottle(['limit' => 200, 'expires' => 10]));

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/dingo-api/2.0.0...

译文地址:https://learnku.com/docs/dingo-api/2.0.0...

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:6
讨论数量: 2
发起讨论 只看当前版本


JANCE
限流提示消息可以自定义吗?
0 个点赞 | 1 个回复 | 问答 | 课程版本 2.0.0
woowli
关于 expires 的时间单位,可以修改吗?
0 个点赞 | 0 个回复 | 问答 | 课程版本 2.0.0