Laravel | マルチログインの実装方法

Laravel

同じサイトシステムでも、利用者側と管理者側で別々に利用することがあります。

その場合、認証方法も別々に構築することが多いと思います。

Laravel にも、同じようなことが実現できます。

下記の参考サイトでは、非常に丁寧に詳しく解説されています。

この記事に説明されている通りに構築、実装していくことで、確実にマルチログインを実現することができると思います。

しかしながら、細かい部分の記載がなかったり、Laravel10の説明ではなかったので、ざっくりと当記事で、補足的に解説していきたいと思います。

Laravel で、マルチログインを実装する場合には、ぜひ、参考にしていただければと思います。

参考サイト

Laravel9のBreezeで、ユーザー登録・ログインを実装する
https://specially198.com/implement-user-registration-and-login-with-breeze-of-laravel9/

Laravel9のBreezeで、マルチログインを実装する
https://specially198.com/implement-multi-login-with-laravel9-breeze/

プロジェクトの作成

Breezeをインストール

続いて、ビューやコントローラーなど各種リソースをインストールします。
Breezeを使用する場合、ReactまたはVueを利用することもできますが、参考サイトと同様に、デフォルトのbladeを利用する方法で記載します。

日本語化

app.phpの変更

日本語ファイルの追加

Laravelは多言語化に対応しています。
「lang」ディレクトリに日本語用のファイルを追加します。

lang/ja.json を以下の内容に書き換えます。
https://github.com/Laravel-Lang/lang/blob/main/locales/ja/json.json

参考サイトの説明通りに、日本語用のファイルを追加後は、ライブラリ不要なのでアンインストールします。

validation.phpには、attributesが定義されていないので、カスタマイズします。

メール認証を有効化する

ユーザー登録時のメール認証がデフォルトでは無効になっているため、有効化します。
Userモデル(app/Models/User.php)を修正します。
use文がコメントアウトを外します。

MustVerifyEmailをインプリメントします。

ユーザー登録後に表示するダッシュボードは、メール認証が完了していないと表示できないように制限を掛けます。
「routes/web.php」を変更します。

middlewareに「verified」を追加します。

動作確認

以上で実装は完了となります。

動作確認をして、問題なければ、マルチログインの実装に進みます。

マルチログインの実装

モデルの作成

デフォルトの認証では、usersテーブルを利用しますが、本記事では、それに加えてadminsテーブルを作成して、認証情報を管理するようにします。
管理者サイトの認証では、adminsテーブルを参照するようになります。
以下のようにモデルファイルとマイグレーションファイルを作成します。

モデルの内容は、デフォルト(User.php)と同じにしておきます。

マイグレーションファイルもデフォルト(usersテーブル)と同じにしておきます。

マイグレーションを行います。

ガードの設定

デフォルトのガードに加え、admin用のガードを追加します。
/config/auth.php を修正します。

ルーティングの設定

ルーティングを追加します。
デフォルトではroutes/auth.php に記載されているので、/routes/admin.php を作成して、同様に設定します。

各コントローラーのパスが変わるのと、指定するmiddlewareを「admin」にしています。

作成したadmin.phpをweb.phpから読み込むために、以下を追加します。
プレフィックスに「admin」を付けて、ルーティングするようにしています。

クッキーの設定

クッキーに関しても、admin用を追加します。
config/session.php を修正します。

adminの場合は、上記で追加した設定を使用するようにします。
app/Providers/AppServiceProvider.php を修正します。

コントローラーの作成

コントローラーを作成します。
デフォルトの認証機能をコピーして、admin用を作成します。
パスを /app/Http/Controllers/Admin としています。

デフォルトの認証機能である /app/Http/Controllers/Auth をコピーして、/app/Http/Controllers/Admin/Auth とします。
また、ProfileControllerなど、auth配下以外のファイルも同様にコピーして作成します。

ユーザー登録

/admin/register へのアクセスで、RegisteredUserController.phpのcreateメソッドが実行されるので、ビューの指定をadmin用に変更します。

また、ログインページへのリンクがあるので、リンク先を変更します。

続いて、送信時にユーザーの登録を行うRegisteredUserController.phpのstoreメソッドを変更します。
以下の内容をadmin用に変更します。

メールアドレスのバリデーションで、ユニークチェックはadminsテーブルに対して行う
対象モデルをAdminに変更
登録後に自動でログインを行う際のガードをadmin用に変更
処理完了後のリダイレクト先をadmin用のダッシュボードに変更

ビューは、送信先をadmin用に変更します。

リダイレクト先はapp/Providers/RouteServiceProvider.phpに定義されているので、admin用を追加します。

ダッシュボード

ユーザー登録が完了すると、ダッシュボードが表示されます。

まず、レイアウトファイルを変更します。
resources/views/layouts/app.blade.php をコピーして、resources/views/layouts/admin.blade.php を作成します。

ナビゲーションメニューがインクルードされているので、admin用に変更します。

ナビゲーションメニューも同様に、resources/views/layouts/navigation.blade.php をコピーして、resources/views/layouts/admin_navigation.blade.php を作成します。

admin用に以下を変更します。(レスポンシブ用も同様に変更)

ダッシュボードのリンク先(2箇所、内1つはrouteIsの判定も変更)
プロフィールのリンク先
ログアウトの送信先とリンク先

dashboard.blade.phpで使用するレイアウトを変更します。

また、app/View/Components/AppLayout.php をコピーして、app/View/Components/AdminLayout.php を作成します。

また、未ログインでダッシュボードにアクセスした場合は、ログインにリダイレクトするようにします。
app/Http/Middleware/Authenticate.php を変更します。
admin用のリクエスト判定を追加し、adminの場合は、admin用のログインのルーティングを返します。

ログイン
/admin/login へのアクセスで、AuthenticatedSessionController.phpのcreateメソッドが実行されるので、ビューの指定をadmin用に変更します。

ビューは、送信先をadmin用に変更します。

また、パスワードを忘れた場合のリンクがあるので、リンク先を変更します。

ログイン時の認証チェックがapp/Http/Requests/Auth/LoginRequest.php で行われます。
admin用のガードを利用してチェックを行うようにします。

ログイン後はダッシュボードにリダイレクトするようにします。

また、ログイン済みでログインにアクセスした場合は、ダッシュボードにリダイレクトするようにします。
app/Http/Middleware/RedirectIfAuthenticated.php を変更します。
ログインチェックをしているところで、admin用のガード判定を追加し、adminの場合は、admin用のダッシュボードにリダイレクトするようにします。

ログアウト
ログアウト時は、AuthenticatedSessionController.phpのdestoryメソッドが実行されます。
以下をadmin用に変更します。

ログアウト時に利用するガードを変更する
ログアウト後のリダイレクト先を変更する

管理サイトの動作確認

管理サイトのlogin にて、ログイン完了後に管理者用のダッシュボードが表示されていれば正常に動作しています。

参考サイト

Laravel9のBreezeで、ユーザー登録・ログインを実装する
https://specially198.com/implement-user-registration-and-login-with-breeze-of-laravel9/

Laravel9のBreezeで、マルチログインを実装する
https://specially198.com/implement-multi-login-with-laravel9-breeze/