Laravel 第八章學習——中介軟體以及策略

gongmeng發表於2019-12-04

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 授權方法時候提起的,呼叫時,預設情況下,我們 不需要 傳遞第一個引數,也就是當前登入使用者至該方法內,因為框架會自動載入當前登入使用者。

注意:此行程式碼一般寫在方法內部的最開頭的位置

相關文章