laravel 访问次数限制

2021/4/28 18:55:12

本文主要是介绍laravel 访问次数限制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

laravel 访问次数限制

定义访问次数限制器

Laravel包括功能强大且可自定义的访问次数限制服务,您可以利用这些服务来限制给指定路由或一组路由的访问次数。首先,您应该定义满足应用程序的配置。在configureRateLimiting应用程序App\Providers\RouteServiceProvider内完成。

访问次数限制器是使用RateLimiter立面的for方法定义的。该for方法接受一个访问次数限制器名称和一个闭包,该闭包返回应应用于分配给该访问次数限制器使用的路由限制配置。限制配置是Illuminate\Cache\RateLimiting\Limit该类的实例。此类包含有用的“生成器”方法,以便您可以快速定义限制。

用例:操作文件App\Providers\RouteServiceProvider

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

/*
*访问次数限制器配置
*/
protected function configureRateLimiting()
{
    RateLimiter::for('global', function (Request $request) {
    //每分钟访问1000次
    return Limit::perMinute(1000);
    });
}

注明:限制的使用方法

Limit::perMinute(1000) //每分钟内最多访问1000次

Limit::perMinutes(20,1000) //20分钟内最多访问1000次

Limit::perHour //每小时内最多访问1000次

Limit::perHour(1000,50) //50小时内最多访问1000次

Limit::perDay(1000) //每天最多访问1000次

如果传入请求超出指定的限制,Laravel将自动返回带有429 HTTP状态代码的响应。如果您想定义自己的限制返回的响应,则可以使用以下response方法:

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000)->response(function () {
        return response('Custom response...', 429);
    });
});

注明:global为全部路由限制

由于限制器回调收到传入的HTTP请求实例,因此您可以根据传入的请求或经过身份验证的用户动态构建适当的限制:

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

注明:upload为针对upload路由限制

细分访问限制

例如,您可能希望允许用户每个IP地址每分钟100次访问给定的路由。为此,您可以在建立限制时使用以下方法:

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip()); //用户访问ip地址
});

为了用另一个示例说明此功能,我们可以将访客的访问权限限制为每个经过身份验证的用户ID每分钟100次或每IP地址每分钟10次:

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()
                ? Limit::perMinute(100)->by($request->user()->id) //用户ip
                : Limit::perMinute(10)->by($request->ip()); //用户访问ip地址
});

注明:$request内容太多了,不一一列出了,编辑器都列出了,根据需要选择就好.

多个访问限制

如果需要,您可以返回给定速率限制器配置的速率限制数组。将根据路由中每个速率限制在数组中的放置顺序对其进行评估:

RateLimiter::for('login', function (Request $request) {
    return [
        Limit::perMinute(500),
        Limit::perMinute(3)->by($request->input('email')), //email输入框
    ];
});

将访问限制器附加到指定路由

可以使用throttle 中间件将访问限制器附加到路由或路由组。中间件接受您希望分配给路由:

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });

    Route::post('/video', function () {
        //
    });
});

附录:throttle安装和简单使用

$ composer require "graham-campbell/throttle:^8.1"

在config/app.php中添加

 'Throttle' => GrahamCampbell\Throttle\Facades\Throttle::class,

执行

$ php artisan vendor:publish

例子:

/*
*  中间件匹配的路由30分钟内最多访问50次
*/

use Illuminate\Support\Facades\Route;

Route::get('foo', ['middleware' => 'GrahamCampbell\Throttle\Http\Middleware\ThrottleMiddleware:50,30', function () {
    return 'Why herro there!';
}]);

这里就简述下,改天写个Throttle全指南

Redis支持

通常,throttle中间件被映射到Illuminate\Routing\Middleware\ThrottleRequests该类。此映射在应用程序的HTTP内核(App\Http\Kernel)中定义。但是,如果您将Redis用作应用程序的缓存驱动程序,则可能希望更改此映射以使用Illuminate\Routing\Middleware\ThrottleRequestsWithRedis该类。此类在使用Redis管理速率限制方面更为有效:

'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,


这篇关于laravel 访问次数限制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程