• 技术文章 >php框架 >Laravel

    一文详解laravel8如何使用throttle中间件

    藏色散人藏色散人2022-12-05 15:36:43转载404

    本篇文章给大家Laravel和throttle中间件的相关知识,主要内容是教大家怎么在 laravel8 中去使用 throttle 中间件的,下面一起来看看吧,希望对大家有所帮助!

    laravle8 访问限制 throttle 中间件

    throttle 中间件介绍

    频率限制经常用在 API 中,用于限制独立请求者对特定 API 的请求频率。每个 API 都会选择一个自己的频率限制时间跨度,GitHub 选择的是 1 小时,Laravel 中间件选择的是 1 分钟。

    例如:throttle:60,1,即设置频率限制为每分钟 60 次,如果一个 IP 一分钟内超过这个限制,那么服务器就会返回 429 Too Many Attempts. 响应。【推荐学习:laravel视频教程

    在 laravel8 中使用 throttle 中间件

    我们通常在这里一般会使用 throttle 中间件来做一个限定条件的速率限定,比如说不在 IP 白名单中的 IP 限制一分钟访问多少次。相对于之前来说,laravel8 中的 throttle 中间件,有了更简单的使用方法。

    首先我们可以看到在 Kernel.php 文件中有这样的定义

        /**
         * The application's route middleware groups.
         *
         * @var array<string, array<int, class-string|string>>
         */
        protected $middlewareGroups = [
            'web' => [
                \App\Http\Middleware\EncryptCookies::class,
                \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
                \Illuminate\Session\Middleware\StartSession::class,
                // \Illuminate\Session\Middleware\AuthenticateSession::class,
                \Illuminate\View\Middleware\ShareErrorsFromSession::class,
                \App\Http\Middleware\VerifyCsrfToken::class,
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
            'api' => [
                // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
                'throttle:api',
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
        ];
        /**
         * The application's route middleware.
         *
         * These middleware may be assigned to groups or used individually.
         *
         * @var array<string, class-string|string>
         */
        protected $routeMiddleware = [
            'auth' => \App\Http\Middleware\Authenticate::class,
            'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
            'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
            'can' => \Illuminate\Auth\Middleware\Authorize::class,
            'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
            'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
            'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
            'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
            'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        ];

    很明显看到其实 laravel8 中定义的'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 是框架已经定义好的,并且在 api 中使用的是 throttle:api。

    当然,一般的大家的用法可能就是在这里把 throttle:api 注释掉,新建一个 throttle 中间件或者是在路由中可以直接使用 throttle:60,1 这样的。

    那如果是需要做一些复杂的判断,比如说我有很多个 IP 白名单想要排除掉,不做速率限制,或者是有个 VVVIP 用户不限制速率的时候怎么办呢?

    这时,我们可以在 laravel8 中找到 App\Providers\RouteServiceProvider.php 文件,在文件最下面我们可以看到这样的写法

      /**
         * Configure the rate limiters for the application.
         *
         * @return void
         */
        protected function configureRateLimiting()
        {
            RateLimiter::for('api', function (Request $request) {
                return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
            });
        }

    这里定义的 api 就是上面在 Kernel.php 文件中所使用的的 throttle:api。在这里,我们可以设定自定义的速率限制条件,比如说限制用户 IP 白名单之外的 IP 访问限制为每小时 60 次,白名单每次可以访问 1000 次

    RateLimiter::for('apiHour', function (Request $request) {
                if(!in_array($request->ip(), config('ip.whitelist'))){
                    return Limit::perHour(60)->by($request->ip());
                }else{
                    return Limit::perHour(1000)->by($request->ip());
                }
            });

    当然别忘记在 config 文件夹中新建 ip.php 文件

    return [
        'whitelist' => [
            '192.168.0.1',
        ],
    ];

    :heart:温馨提示:在使用的时候,用的是 api 接口路由的话,如果想使用自定义的 throttle:apiHour 不要忘记把原来 Kernel.php 中的 throttle:api 注释掉哟!

    最后我们就可以在路由中快乐的使用自定义的速率控制中间件了

    Route::group([
        'middleware' => ['throttle:apiHour']
    ], function ($router) {
       Route::get('user', function (Request $request) {
           return $request->user();
       });
    });

    以上就是我总结的 laravel8 中使用自定义 throttle 速率器的问题,如有问题,大家可以随时指正,谢谢各位同学观看!

    本文系转载,原文地址:https://learnku.com/articles/73728

    以上就是一文详解laravel8如何使用throttle中间件的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:laravle8
    上一篇:Laravel怎么优化性能?18个优化必备知识分享 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Laravel8中怎么优化数据库查询?18 个优化建议分享• 一起来聊聊Laravel8的路由与控制器• Laravel8+Vuejs怎么实现单页面应用(SPA)• Laravel8如何进行性能优化?优化技巧分享• 详解Laravel8 ES封装及其使用方法
    1/1

    PHP中文网