【Laravel】認証機能におけるガードとプロバイダの仕組みを理解しよう

Laravel認証機能のguardとproviderとは?

Laravelの認証システムは、ガード (guards)とプロバイダ (providers)という概念を中心に設計されています。本記事では、これらの仕組みと、デフォルトのガードがどのように機能するかを解説します。

はじめに

この記事では、Laravelの認証機能をカスタマイズして「管理者用認証」を追加する例を用いて解説します。

Laravelはデフォルトでは、usersテーブルに存在するデータを使用した、一種類の認証機能(通常のユーザー認証)を備えていますが、カスタマイズすることで、以下のように複数の認証フローを持つアプリケーションを構築できます。

  • 通常のユーザー認証: usersテーブルを使用
  • 管理者用認証: adminsテーブルを使用

この記事の例では、`admin` ガードとプロバイダを新たに設定し、管理者認証を分離する方法を解説します。

1. ガードとは?

ガードとは、どのようにユーザーが認証されるかを定義する仕組みです。Laravelでは複数のガードを設定でき、それぞれが異なる方法で認証を処理できます。

デフォルトの config/auth.php ファイルでは、以下のようにガードが設定されています。


'guards' => [
    'web' => [
        'driver' => 'session', // セッションを使用して認証を管理
        'provider' => 'users', // usersプロバイダを使用
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins', // adminsプロバイダを使用
    ],
],
  • webガード: 通常のユーザー認証に使用されます。
  • adminガード: 管理者ユーザー認証に使用されます。

それぞれのガードは、認証時に Auth::guard() を使用して明示的に呼び出すことができます。

ガードの使用例

例えば、通常のユーザーと管理者のログイン処理を分ける場合:


// 通常のユーザー
Auth::guard('web')->attempt($credentials);

// 管理者ユーザー
Auth::guard('admin')->attempt($credentials);

2. プロバイダとは?

プロバイダとは、どのようにユーザー情報を取得するかを定義する仕組みです。通常は Eloquent モデルかデータベースクエリビルダを使用してユーザー情報を取得します。

config/auth.php の例:


'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class, // Eloquentモデル
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class, // 管理者用Eloquentモデル
    ],
],

プロバイダはガードと連携し、指定されたユーザー情報を元に認証を行います。

3. デフォルトガードの仕組み

Laravelは、config/auth.php ファイルでデフォルトのガードを指定します。これにより、Auth:: メソッドを使用する際に、どのガードが使われるかを制御できます。


'defaults' => [
    'guard' => 'web', // デフォルトで使用されるガード
    'passwords' => 'users',
],

例えば、デフォルトが web に設定されている場合:


// デフォルトのガード (web) を使用
Auth::attempt($credentials);

これは、以下と同じ動作になります:


// 明示的にwebガードを指定
Auth::guard('web')->attempt($credentials);

一方で、デフォルトのガードではない、管理者ユーザーの認証には明示的に admin ガードを指定する必要があります。


Auth::guard('admin')->attempt($credentials);

4. デフォルトガードの変更

特定の場面でデフォルトのガードを変更したい場合、config/auth.phpdefaults.guard を変更します。


'defaults' => [
    'guard' => 'admin', // デフォルトをadminに変更
    'passwords' => 'admins',
],

これにより、Auth::attempt() を使用した場合に admin ガードが使用されるようになります。

5. ガードを省略できる場合とできない場合

デフォルトガードを使用する場合、ガードを省略することが可能です。しかし、複数の認証方式が存在する場合(例: 通常ユーザーと管理者ユーザー)には、ガードを明示的に指定する必要があります。

通常ユーザーの例:


if (Auth::attempt($credentials)) {
    // デフォルトのwebガードを使用
    $request->session()->regenerate();
}

管理者ユーザーの例:


if (Auth::guard('admin')->attempt($credentials)) {
    // adminガードを使用
    $request->session()->regenerate();
}

6. まとめ

Laravelの認証システムにおけるガードとプロバイダの仕組みを理解することで、アプリケーション内の異なる認証フローを簡単に実装できます。

  • ガード: 認証方法を定義(例: web, admin)
  • プロバイダ: ユーザー情報の取得方法を定義(例: Eloquentモデル)
  • デフォルトガードを利用する場合はガード指定を省略可能
  • 複数の認証フローを実装する場合はガードを明示的に指定

これらを活用して、ユーザーごとに適切な認証フローを構築してください。

Follow me!