目次
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.php
の defaults.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モデル)
- デフォルトガードを利用する場合はガード指定を省略可能
- 複数の認証フローを実装する場合はガードを明示的に指定
これらを活用して、ユーザーごとに適切な認証フローを構築してください。