Skip to main content

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

Auth ファサードと AuthManager

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

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

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

カスタムガードの実装

GuardHelpers トレイト

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

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

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

ガードクラスを作成する

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

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

AppServiceProviderboot() メソッドで Auth::extend() を使ってガードを登録します。
Auth::createUserProvider()config/auth.phpproviders 設定を読み取り、対応する 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.phpproviders セクションに追加します:
ガードとプロバイダーを組み合わせます:

実践的なユースケース

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

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日