Skip to main content

Laravelの認証システムの内部構造

Auth ファサードと AuthManager

Auth ファサードは Illuminate\Auth\AuthManager のプロキシです。AuthManager はドライバーパターンで複数のガードを管理し、config/auth.php の設定に基づいて適切なガードインスタンスを生成・キャッシュします。
resolve() は config/auth.php の guards 配列から driver キーを読み取り、対応するファクトリークロージャを呼び出します。組み込みの session や token ドライバーも同じ仕組みで登録されています。

Guard インターフェースと StatefulGuard インターフェースの違い

Laravelの認証ガードは Illuminate\Contracts\Auth\Guard を最低限実装する必要があります。セッションを維持する必要がある場合は StatefulGuard を実装します。
StatefulGuard は Guard を継承し、セッションやクッキーを使ったログイン状態の維持に必要なメソッドを追加します。
API認証や独自トークン認証など、セッションが不要なガードは Guard だけを実装すればよいです。管理者ログインのようにセッションが必要な場合は StatefulGuard を実装します。

カスタムガードの実装

GuardHelpers トレイト

Guard インターフェースの check()、guest()、id()、hasUser() はほぼ共通の実装になるため、Laravelは Illuminate\Auth\GuardHelpers トレイトを提供しています。このトレイトを使うと、必須実装を user() と validate() の2メソッドに絞れます。

APIトークン認証ガードの実装例

TokenGuard の設計に倣い、シンプルなAPIトークン認証ガードを実装します。リクエストヘッダーまたはクエリパラメータからトークンを取得し、UserProvider を通してユーザーを解決します。
1

ガードクラスを作成する

app/Auth ディレクトリにガードクラスを作成します。
2

サービスプロバイダーでガードを登録する

AppServiceProvider の boot() メソッドで Auth::extend() を使ってガードを登録します。
Auth::createUserProvider() は config/auth.php の providers 設定を読み取り、対応する UserProvider インスタンスを返します。独自プロバイダーを作らない限り、この呼び出し方で標準の EloquentUserProvider を使えます。
3

config/auth.php でガードを設定する

config/auth.php に新しいガードを追加します。
4

ルートにガードを適用する

auth ミドルウェアにガード名を指定します。
コントローラーやコード内で特定のガードを使うには Auth::guard('api') または auth('api') を呼び出します。

クロージャによる簡易ガード

Auth::viaRequest() を使うと、クラスを作らずクロージャだけでシンプルなガードを定義できます。プロトタイプや非常にシンプルな認証に向いています。
config/auth.php での設定:
Auth::viaRequest() で定義したガードは UserProvider を使わないため、retrieveById() などのプロバイダーメソッドが機能しません。本番環境では Auth::extend() を使ったクラスベースのガードを推奨します。

カスタム UserProvider の実装

ユーザー情報をデータベース以外のソース(外部API、LDAPなど)から取得する場合は、Illuminate\Contracts\Auth\UserProvider インターフェースを実装します。

カスタム UserProvider の登録

config/auth.php の providers セクションに追加します:
ガードとプロバイダーを組み合わせます:

実践的なユースケース

マルチ認証(管理者と一般ユーザーで別ガード)

1

管理者モデルを作成する

管理者用のEloquentモデルを用意します。Authenticatable を継承することで Auth システムと連携できます。
2

config/auth.php を設定する

3

ルートとミドルウェアを設定する

4

ガードを指定してログイン処理を書く

JWTトークンによる外部API認証

外部のJWT認証サービスを使う場合のカスタムガード実装例です。
AppServiceProvider での登録:
Auth::guard('jwt')->payload() のように、カスタムガード固有のメソッドにもアクセスできます。Auth::guard() が返すのはガードインスタンスそのものなので、インターフェースにないメソッドも呼び出せます。

テスト

カスタムガードのユニットテストでは、UserProvider をモックしてガードの動作を確認します。
ActingAs を使った機能テストでは、特定のガードにユーザーをセットできます。

関連ページ

認証(入門)

スターターキットや標準的な認証フローを確認します。

サービスコンテナ

ガード登録で使うサービスコンテナの仕組みを理解します。
最終更新日 2026年3月29日