Skip to main content

Laravel 驗證系統的內部結構

Auth Facade 與 AuthManager

Auth Facade 是 Illuminate\Auth\AuthManager 的代理。AuthManager 以 Driver 模式管理多個 Guard,並依照 config/auth.php 的設定產生並快取適當的 Guard 實例。
resolve() 會從 config/auth.phpguards 陣列讀取 driver 鍵,並呼叫對應的 factory closure。內建的 sessiontoken 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

AppServiceProviderboot() 方法中使用 Auth::extend() 註冊 Guard。
Auth::createUserProvider() 會讀取 config/auth.phpproviders 設定,回傳對應的 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.phpproviders 區段加入:
將 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日