Skip to main content

Laravel 驗證系統的內部結構

Auth Facade 與 AuthManager

Auth Facade 是 Illuminate\Auth\AuthManager 的代理。AuthManager 以 Driver 模式管理多個 Guard,並依照 config/auth.php 的設定產生並快取適當的 Guard 實例。
resolve() 會從 config/auth.php 的 guards 陣列讀取 driver 鍵,並呼叫對應的 factory closure。內建的 session、token driver 也是以相同機制註冊的。

Guard 介面與 StatefulGuard 介面的差異

Laravel 的驗證 Guard 至少須實作 Illuminate\Contracts\Auth\Guard。若需維持 session,則實作 StatefulGuard。
StatefulGuard 繼承 Guard,並加入使用 session 或 cookie 維持登入狀態所需的方法。
對於 API 驗證或自訂 Token 驗證等不需 session 的 Guard,僅需實作 Guard 即可。若如管理員登入等需要 session 時,則實作 StatefulGuard。

自訂 Guard 的實作

GuardHelpers trait

由於 Guard 介面的 check()、guest()、id()、hasUser() 幾乎皆為相同實作,Laravel 提供了 Illuminate\Auth\GuardHelpers trait。使用此 trait 後,必要實作的內容便可縮減至 user() 與 validate() 兩個方法。

API Token 驗證 Guard 的實作範例

參照 TokenGuard 的設計,實作一個簡單的 API Token 驗證 Guard。從請求 Header 或 Query 參數取得 Token,並經由 UserProvider 解析出使用者。
1

建立 Guard 類別

於 app/Auth 目錄建立 Guard 類別。
2

於服務提供者註冊 Guard

在 AppServiceProvider 的 boot() 方法中使用 Auth::extend() 註冊 Guard。
Auth::createUserProvider() 會讀取 config/auth.php 的 providers 設定,回傳對應的 UserProvider 實例。只要不建立自訂 Provider,透過此呼叫方式即可使用標準的 EloquentUserProvider。
3

於 config/auth.php 設定 Guard

在 config/auth.php 加入新的 Guard。
4

於路由套用 Guard

在 auth 中介層指定 Guard 名稱。
要在 Controller 或程式碼中使用特定 Guard,可呼叫 Auth::guard('api') 或 auth('api')。

以 Closure 定義簡易 Guard

使用 Auth::viaRequest() 可以不建立類別,僅以 closure 定義簡單的 Guard。適合原型設計或極為簡易的驗證。
config/auth.php 的設定:
以 Auth::viaRequest() 定義的 Guard 不使用 UserProvider,因此 retrieveById() 等 Provider 方法無法運作。正式環境建議使用透過 Auth::extend() 的類別式 Guard。

自訂 UserProvider 的實作

若要從資料庫以外的來源(外部 API、LDAP 等)取得使用者資訊,可實作 Illuminate\Contracts\Auth\UserProvider 介面。

自訂 UserProvider 的註冊

在 config/auth.php 的 providers 區段加入:
將 Guard 與 Provider 搭配:

實務使用情境

多重驗證(管理員與一般使用者使用不同 Guard)

1

建立管理員 Model

準備管理員用的 Eloquent Model。繼承 Authenticatable 即可與 Auth 系統整合。
2

設定 config/auth.php

3

設定路由與中介層

4

指定 Guard 撰寫登入處理

以 JWT Token 進行外部 API 驗證

使用外部 JWT 驗證服務的自訂 Guard 實作範例。
於 AppServiceProvider 註冊:
也可以像 Auth::guard('jwt')->payload() 這樣存取自訂 Guard 專屬的方法。因為 Auth::guard() 回傳的是 Guard 實例本身,所以可呼叫非介面所定義的方法。

測試

自訂 Guard 的單元測試中,透過 mock UserProvider 來確認 Guard 的行為。
透過 ActingAs 的功能測試中,可以將使用者設定到特定的 Guard。

相關頁面

驗證(入門)

查看啟動套件及標準的驗證流程。

服務容器

理解在 Guard 註冊中使用的服務容器機制。
最後修改於 2026年8月2日