$middleware:全局中間件,要對全部的請求要作一些處理的時候,就適合定義在該屬性內。(好比統計請求次數這些)
$middlewareGroups:中間件組,好比咱們項目有api請求和web的請求的時候,就要把兩種類型的請求中間件分離開來,這時候就須要咱們中間件組啦。
$routeMiddleware:路由中間件,有些個別的請求,咱們須要執行特別的中間件時,就適合定義在這屬性裏面。php
如何使用Laravel的限速中間件
所以,請參閱Laravel 5.2中的新功能。有一個throttle可使用的新中間件。咱們來看看咱們的API組:web
Route::group(['prefix' => 'api'], function () {api
Route::get('people', function () {app
return Person::all();spa
});});中間件
讓咱們應用一個閥門。默認節流將其限制爲每分鐘60次嘗試,而且若是達到限制,則會禁止其訪問一分鐘。blog
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的中間件Illuminate\Auth\Middleware\Authorize。它爲咱們提供了一種調用Gate的簡單方法,並檢查它是否容許用戶訪問某些內容。
幸運的是,它已經啓用,但咱們不管如何檢查。打開文件app/Http/Kernel.php並找到 $routeMiddleware屬性,它應該以下所示:
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::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', 'Adminpanel\Dashboard@index');
// future adminpanel routes also should belong to the group
});
正如你所看到的,咱們建立一個包含全部adminpanel路由的路由組。它容許咱們應用一次中間件,而且它將自動應用於組包含的全部路由。
下次有人打開URL時/adminpanel/dashboard,路由器會調用中間件can並傳遞參數accessAdminpanel,這實際上就是咱們Gate的名字。