Laravel 中介軟體 (Middleware) 為我們提供了一種非常棒的過濾機制來過濾進入應用的 HTTP 請求,例如,當我們使用 Auth 中介軟體來驗證使用者的身份時,如果使用者未通過身份驗證,則 Auth 中介軟體會把使用者重定向到登入頁面。如果使用者通過了身份驗證,則 Auth 中介軟體會通過此請求並接著往下執行。Laravel 框架預設為我們內建了一些中介軟體,例如身份驗證、CSRF 保護等。所有的中介軟體檔案都被放在專案的 app/Http/Middleware
資料夾中。
public function __construct()
{
$this->middleware('auth', [
'except' => ['show', 'create', 'store']
]);
}
__construct
是 PHP 的構造器方法,當一個類物件被建立之前該方法將會被呼叫。我們在 __construct
方法中呼叫了 middleware
方法,該方法接收兩個引數,第一個為中介軟體的名稱,第二個為要進行過濾的動作。我們通過 except
方法來設定 指定動作 不使用 Auth 中介軟體進行過濾,意為 —— 除了此處指定的動作以外,所有其他動作都必須登入使用者才能訪問,類似於黑名單的過濾機制。相反的還有 only
白名單方法,將只過濾指定動作。我們提倡在控制器 Auth 中介軟體使用中,首選 except
方法,這樣的話,當你新增一個控制器方法時,預設是安全的,此為最佳實踐。
生成策略 php artisan make:policy UserPolicy ;此命令會生成 app/Policies/UserPolicy 策略類,可以在類中編寫需要進行授權的例項的相關方法;
Laravel 提供兩種註冊授權策略的方式,第一種是手動指定,第二種是 Laravel 5.8 新增功能 —— 自動授權註冊。
自動授權預設會假設 Model 模型檔案直接存放在 app
目錄下,鑑於我們已將模型存放目錄修改為 app/Models
,接下來還需自定義自動授權註冊的規則,修改 boot()
方法:
app/Providers/AuthServiceProvider.php
public function boot() {
$this->registerPolicies(); // 修改策略自動發現的邏輯
Gate::guessPolicyNamesUsing(function ($modelClass) {
// 動態返回模型對應的策略名稱,如:// 'App\Models\User' => 'App\Policies\UserPolicy',
return 'App\Policies\\'.class_basename($modelClass).'Policy';
});
}
授權策略定義完成之後,我們便可以通過在使用者控制器中使用 authorize
方法來驗證使用者授權策略。預設的 App\Http\Controllers\Controller
類包含了 Laravel 的 AuthorizesRequests
trait。此 trait 提供了 authorize
方法,它可以被用於快速授權一個指定的行為,當無許可權執行該行為時會丟擲 HttpException。authorize
方法接收兩個引數,第一個為授權策略的名稱,第二個為進行授權驗證的資料。
$this->authorize('update', $user);
這裡 update 是指授權類裡的
update
授權方法,$user
對應傳參update
授權方法的第二個引數。正如上面定義update
授權方法時候提起的,呼叫時,預設情況下,我們 不需要 傳遞第一個引數,也就是當前登入使用者至該方法內,因為框架會自動載入當前登入使用者。
注意:此行程式碼一般寫在方法內部的最開頭的位置