Laraveで複数種類のログインを実装する方法

アイキャッチ画像

世にあふれるログイン実装の記事ってシンプルすぎません?

大抵の記事を見ると、Laravelでデフォルトで用意されているlaravel/breezeを使ってサクッとログイン画面が出来ます!ね?簡単でしょ!といった記事ばかりです。

会員向けサービスを提供するWebアプリの場合、それで十分といえるのでしょうか?

実際には異なる種類のユーザが存在することも

会員向けサービスの公開側は、会員のログイン機能がまず必要になります。ただ、それとは別に会員を管理する画面が必要になりますよね?つまりは、会員情報を管理するための管理者ユーザも必要です。

当然管理画面用の別のログイン画面も必要になります。

複数レイヤーでのログイン実装

では複数レイヤーのログイン機能を実装するにはどうするべきでしょうか?

例えば、次のような予約システムを考えてみます。

  • 複数店舗を管理する管理者
  • 予約を管理する店舗
  • 予約するユーザ

guardの設定

複数レイヤーでのログインではguardという機能を利用します。

各ユーザのテーブルとguardを次の用に定義します。

ユーザの種類テーブルguard
管理者admin_usersadmin
店舗shop_usersshop
ユーザusersuser

config/auth.phpに次のようにguardを設定します。

ログイン機能

ログイン用のControllerとFormRequestは次のように設定します。

管理画面での一例ですが、店舗、ユーザ向けはそれぞれguardの名称をそれぞれのものにして実装します。

ルーティング

ルーティング設定でもmiddlewareで各guardごとに認証の有無をチェックします。

店舗、ユーザ向けはそれぞれguardの名称とnamespace、prefixを変更して実装します。

まとめ

通常のシンプルなログインはAuthファサードを利用してログイン、ログアウトを制御しますが、そこにguardを追加するのみでシンプルに複数レイヤーでのログインが実装できることが分かります。

ログアウト処理もguardごとに行うので、店舗とユーザとして別タブでログインしていても一方のみログアウト、もう一方はログイン状態を維持といったことも可能になります。