$middleware:全局中间件,要对所有的请求要做一些处理的时候,就适合定义在该属性内。(比如统计请求次数这些)
$middlewareGroups:中间件组,比如我们项目有api请求和web的请求的时候,就要把两种类型的请求中间件分离开来,这时候就需要我们中间件组啦。
$routeMiddleware:路由中间件,有些个别的请求,我们需要执行特别的中间件时,就适合定义在这属性里面。
如何使用Laravel的限速中间件
因此,请参阅Laravel 5.2中的新功能。有一个throttle可以使用的新中间件。我们来看看我们的API组:
Route::group(['prefix' => 'api'], function () {
Route::get('people', function () {
return Person::all();
});});
让我们应用一个阀门。默认节流将其限制为每分钟60次尝试,并且如果达到限制,则会禁止其访问一分钟。
Route::group(['prefix' => 'api', 'middleware' => 'throttle'], function () {
Route::get('people', function () {
return Person::all();
});});
如果您向此api/people路线发出请求,您现在将在响应标题中看到以下行:
HTTP/1.1 200 OK
... other headers here ...
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
请记住,这种回应意味着:
A)此请求成功(状态为200)
B)您可以尝试此路线每分钟60次
C)您这一分钟还有59次请求
如果我们超过费率限制,我们会得到什么回应?
HTTP/1.1 429 Too Many Requests
... other headers here ...
Retry-After: 60
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
而回应的实际内容将是一个字符串:“尝试太多”。
如果我们在30秒后再次尝试,该怎么办?
HTTP/1.1 429 Too Many Requests
... other headers here ...
Retry-After: 30
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
同样的回应,除了Retry-After计时器告诉我们等待多久的时间减少了30秒。
定制throttle中间件
让我们做一些定制。我们希望将其限制为每分钟5次尝试。
Route::group(['prefix' => 'api', 'middleware' => 'throttle:5'], function () {
Route::get('people', function () {
return Person::all();
});});
如果我们想改变它,如果有人达到极限,他们又不能再试10分钟了?
Route::group(['prefix' => 'api', 'middleware' => 'throttle:5,10'], function () {
Route::get('people', function () {
return Person::all();
});});
Can
我们将使用名为Laravel的中间件IlluminateAuthMiddlewareAuthorize。它为我们提供了一种调用Gate的简单方法,并检查它是否允许用户访问某些内容。
幸运的是,它已经启用,但我们无论如何检查。打开文件app/Http/Kernel.php并找到 $routeMiddleware属性,它应该如下所示:
protected $routeMiddleware = [
'auth' => IlluminateAuthMiddlewareAuthenticate::class,
'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,
'can' => IlluminateAuthMiddlewareAuthorize::class,
'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
];
是的,它在那里并响应这个名字can。让我们看看它的行动。
保护路线
首先,让我们创建一个控制器来保护使用下面的工匠 命令(啊,工匠再次):
php artisan make:controller Adminpanel/Dashboard
它Dashboard在文件中创建新的控制器app/Http/Controllers/Adminpanel/Dashboard.php
但是,控制器是空的。我们需要创建索引操作,请打开文件并在控制器中插入以下简单方法:
class Dashboard extends Controller{
public function index() {
return 'This is the dashboard';
}
}
现在我们需要创建一个路由并使用中间件来保护它。打开文件routes/web.php并在其结尾处添加以下代码:
Route::group(['middleware' => 'can:accessAdminpanel'], function() {
Route::get('/adminpanel/dashboard', 'AdminpanelDashboard@index');
// future adminpanel routes also should belong to the group
});
正如你所看到的,我们创建一个包含所有adminpanel路由的路由组。它允许我们应用一次中间件,并且它将自动应用于组包含的所有路由。
下次有人打开URL时/adminpanel/dashboard,路由器会调用中间件can并传递参数accessAdminpanel,这实际上就是我们Gate的名字。