Laravel9でマルチ認証(一般ユーザーと管理者で別々のログイン機能)を実装する

マルチ認証の実装方法

Laravelで会員ページを設けてログイン認証してもらうのは比較的すぐに実装できますが、マルチ認証を実装するのはやや手がかかります。

マルチ認証とはECサイトなどでよく採用される形式で

  • 一般の購入者が配送先住所の記録などをするマイページ
  • ECに出品する商品などを管理する管理者サイト

のように別々に管理画面を設ける認証のことです。

Laravelはバージョンごとに認証系の実装方法も異なることから、マルチ認証の方法がわかりにくいですよね。

そこでこの記事では、Laravel9におけるマルチ認証の実装方法を丁寧に解説します。
この手順通りに実装すれば、一般ユーザー向け・管理者向けに別々の認証システムを作ることができます。

目次

システムの全体像

この記事ではわかりやすいように

  • ログインなしで見られるものを「フロント」
  • 一般ユーザーがログインして閲覧するものを「マイページ」
  • 管理者のログインしてみるページを「管理画面」

と呼ぶことにします。

フロント

マルチ認証には深く関わらないので、トップページのみとします。

マイページ

モデルUserモデル
メールアドレス・パスワードで認証します
データベースのテーブルusers
ルーティング/mypage 以下をログイン必須にする
ログインページ/login

管理画面

モデルAdminモデル
メールアドレス・パスワードで認証します
データベースのテーブルadmins
ルーティング/admin 以下をログイン必須にする
ログインページ/admin/login

マルチ認証に必要なマイグレーションの作成

まずはマルチ認証をするために必要なテーブルを作るためのマイグレーションを作成します。

usersテーブルのマイグレーションファイル

usersテーブルはLaravelでデフォルトで用意されているものをそのまま使います。
追加したいカラムなどがあれば適宜、追記してください。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
  /**
   * Run the migrations.
   *
   * @return void
   */
  public function up()
  {
    Schema::create('users', function (Blueprint $table) {
      $table->id();
      $table->string('name');
      $table->string('email')->unique();
      $table->timestamp('email_verified_at')->nullable();
      $table->string('password')->nullable();
      $table->rememberToken();
      $table->timestamps();
    });
  }

  /**
   * Reverse the migrations.
   *
   * @return void
   */
  public function down()
  {
    Schema::dropIfExists('users');
  }
};

adminsテーブルのマイグレーションファイル

次にusersのマイグレーションファイルを参考に、adminsのものを用意していきます。

ターミナルでAdminモデルと一緒にマイグレーションファイルを作成してください。

$ php artisan make:model Admin -m

INFO  Model [app/Models/Admin.php] created successfully.  
INFO  Created migration [XXXXXXX_create_admins_table].  

-m でモデルと同時にマイグレーションファイルを作成することになります。

次に作成されたマイグレーションファイルの中身を記載していきます。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
  /**
   * Run the migrations.
   *
   * @return void
   */
  public function up()
  {
    Schema::create('admins', function (Blueprint $table) {
      $table->id();
      //↓ここから
      $table->string('email')->unique();
      $table->string('password');
      $table->rememberToken();
      //↑ここまで追記
      $table->timestamps();
    });
  }

  /**
   * Reverse the migrations.
   *
   * @return void
   */
  public function down()
  {
    Schema::dropIfExists('admins');
  }
};

この他、必要なカラムがあれば追記しておいてください。
今回は認証機能だけ実装しますので、必要なところだけの実装です。

マイグレーションの実行

準備ができたら、マイグレーションを実行しましょう。

$ php artisan migrate

マルチ認証に必要なモデルの設定

次にモデルの設定をしていきます。

Userモデルは変更する必要がありませんので、Adminモデルだけ調整します。

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;  //追記
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class Admin extends Authenticatable  //← Model から Authenticatable に変更
{
  use HasApiTokens, HasFactory, Notifiable;

  protected $fillable = [
    'email',
    'password',
  ];

  protected $hidden = [
    'password',
    'remember_token',
  ];

  protected $casts = [
    'email_verified_at' => 'datetime',
  ];
}

中身はUserモデルを参考にしてOK。

注意するのは7行目と11行目です。

認証に使うため Authenticatableuseしてください。

use Illuminate\Foundation\Auth\User as Authenticatable;

その上で継承するクラスを変更します。

class Admin extends Authenticatable

マルチ認証で使うテストデータを作成する

このままではユーザーが存在せず、ログインができませんので、Seederを利用してテストデータを作成しておきます。

  • UserSeeder
  • AdminSeeder

が必要です。

$ php artisan make:seeder UserSeeder
INFO  Seeder [database/seeders/UserSeeder.php] created successfully. 

$ php artisan make:seeder AdminSeeder
INFO  Seeder [database/seeders/AdminSeeder.php] created successfully. 

UserSeeder

database/seeders/UserSeeder.php が作成されているので、挿入するデータを記載します。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
  /**
   * Run the database seeds.
   *
   * @return void
   */
  public function run()
  {
    DB::table('users')->insert([
      [
        'name' => '田中太郎',
        'email' => 'taro@gmail.com',
        'password' => Hash::make('password'),
      ],
    ]);
  }
}

ランダムで複数人分を作成してもいいですが、今回はわかりやすさ重視でとりあえず1人だけ。
パスワードをハッシュ化して登録するために必要になるので、7行目にuse Illuminate\Support\Facades\Hash;を記載するのを忘れずに。

AdminSeeder

database/seeders/AdminSeeder.php も同様です。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class AdminSeeder extends Seeder
{
  /**
   * Run the database seeds.
   *
   * @return void
   */
  public function run()
  {
    DB::table('admins')->insert([
      [
        'email' => 'developer@gmail.com',
        'password' => Hash::make('password'),
      ],
    ]);
  }
}

DatabaseSeeder

最後に作成したUserSeederAdminSeederを呼び出せるように、database/seeders/DatabaseSeeder.phpに追記しておきます。

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
  /**
   * Seed the application's database.
   *
   * @return void
   */
  public function run()
  {
    $this->call([
      AdminSeeder::class,
      UserSeeder::class,
    ]);
  }
}

準備できたらartisanコマンドでデータ挿入します。

$ php artisan db:seed

マルチ認証に必要なルーティング設定

以下のURLで動作することを想定しています。

【フロントページ】
/ : トップページ的なページ

【管理画面】
/admin/login : ログインページ
/admin/logout : ログアウト処理(表示なし)
/admin : ログイン後に表示するページ

【マイページ】
/login : ログインページ
/logout : ログアウト処理(表示なし)
/mypage : ログイン後に表示するページ

すべてを1つのファイル(routes/web.php)に記載すると将来的にパンクしそうなので、

  • routes/web.php(フロントページ系)
  • routes/admin.php(管理画面系)
  • routes/mypage.php(マイページ系)

のようにファイルも分けて記載しておくのがおすすめ。

routes/web.php

admin.phpmypage.phpincludeするのを忘れずに。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;

//管理画面系・マイページ系のファイル呼び出し
include __DIR__ . '/admin.php';
include __DIR__ . '/mypage.php';

//フロント
Route::get('/', [HomeController::class, 'top'])->name('top');

ログインが必要ないページをHomeControllerで作成することにしました。

合わせてartisanコマンドでコントローラーを作成しておいてもよいでしょう。

$ php artisan make:controller HomeController
INFO  Controller [app/Http/Controllers/HomeController.php] created successfully.  

routes/admin.php

新しく以下のようにファイルを作成します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Admin\LoginController;
use App\Http\Controllers\Admin\HomeController;

Route::prefix('admin')->group(function () {
  Route::get('login', [LoginController::class, 'index'])->name('admin.login.index');
  Route::post('login', [LoginController::class, 'login'])->name('admin.login.login');
  Route::get('logout', [LoginController::class, 'logout'])->name('admin.login.logout');

  Route::get('/', [HomeController::class, 'dashboard'])->name('admin.dashboard');
});

ログイン・ログアウト系の処理をAdmin/LoginControllerで、ログイン後に表示するページをAdmin/HomeControllerで管理することにしました。

いちいち/adminと書くのが面倒なので、Route::prefix('admin')->groupでまとめています。
この方がスッキリして書き間違いが減るのでおすすめ。

あわせてartisanコマンドでコントローラーを作成。

$ php artisan make:controller Admin/LoginController
INFO  Controller [app/Http/Controllers/Admin/LoginController.php] created successfully.  

$ php artisan make:controller Admin/HomeController
INFO  Controller [app/Http/Controllers/Admin/HomeController.php] created successfully.  

routes/mypage.php

こちらも新しくファイルを作成して以下のように記載します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LoginController;
use App\Http\Controllers\Mypage\HomeController;

Route::get('login', [LoginController::class, 'index'])->name('login.index');
Route::post('login', [LoginController::class, 'login'])->name('login.login');
Route::get('logout', [LoginController::class, 'logout'])->name('login.logout');

Route::prefix('mypage')->group(function () {
  Route::get('/', [HomeController::class, 'dashboard'])->name('mypage.dashboard');
});

Route::prefix('mypage')->middleware('auth.members:members')->group(function () {
  Route::get('/', [HomeController::class, 'dashboard'])->name('mypage.dashboard');
});

同じく、LoginControllerとHomeControllerを使う想定です。

ただし注意が必要なのは、一般ユーザー向けのログイン処理系URLは/loginなどにする予定(/mypage/loginなどにしない予定)なので、Route::prefix('mypage')->groupの中に記述していないことです。

人によってはroutes/web.phpに記述した方がしっくり来るかもしれません。
これは好き好きで、わかりやすさを優先してください。

artisanコマンドでコントローラーを作っておきます。

$ php artisan make:controller LoginController
INFO  Controller [app/Http/Controllers/LoginController.php] created successfully.  

$ php artisan make:controller Mypage/HomeController
INFO  Controller [app/Http/Controllers/Mypage/HomeController.php] created successfully.  

マルチ認証を成立させるためのコンフィグ設定

マルチ認証ができるようにするための設定をconfig/auth.phpに記載していきます。
今回は管理画面とマイページの2つが必要なので、その定義を追記する形です。

※以下、必要な箇所だけ抜粋

//38行目あたり
'guards' => [
  'web' => [
    'driver' => 'session',
    'provider' => 'users',
  ],
  'members' => [
    'driver' => 'session',
    'provider' => 'users',
  ],
  'admins' => [
    'driver' => 'session',
    'provider' => 'admins',
  ],
],

//70行目あたり
'providers' => [
  'users' => [
    'driver' => 'eloquent',
    'model' => App\Models\User::class,
  ],
  'admins' => [
    'driver' => 'eloquent',
    'model' => App\Models\Admin::class,
  ],
  'members' => [
    'driver' => 'eloquent',
    'model' => App\Models\User::class,
  ],
],

具体的には認証に必要な「ガード」と「プロバイダ」の設定です。

Laravelの認証機能は、基本的に「ガード」と「プロバイダ」で構成されています。ガードは、リクエストごとにユーザーを認証する方法を定義します。たとえば、Laravelには、セッションストレージとクッキーを使用して状態を維持する「セッション」ガードを用意しています。

プロバイダは、永続ストレージからユーザーを取得する方法を定義します。LaravelはEloquentとデータベースクエリビルダを使用してユーザーを取得するためのサポートを用意しています。ただし、アプリケーションの必要性に応じて、追加のプロバイダを自由に定義できます。

Laravel 8.x 認証

あえて平たく言うと「どうやって認証するか」が「ガード」で、「どこの情報と照らし合わせて認証するか」がプロバイダです。

通常、LaravelにおいてWebに表示した画面で認証をするときはセッションを使うので、今回もガードでセッションを利用することを宣言しています。

今回は管理画面系の認証はadmins、マイページ系の認証はmembersとして設定することにしました。

マルチ認証に必要なコントローラー・ビューの作成

ガードとプロバイダを設定したことでadminsmembersの2系統の認証が使えるようになったので、いよいよコントローラーでのログイン処理・ログアウト処理を作っていきましょう。

管理画面のログイン系コントローラー

app/Http/Controllers/Admin/LoginController.php で認証系の処理をまとめます。

実装するメソッドは下記の3つ。

  • index() : ログインページの表示のみ
  • login() : ログイン処理
  • logout() : ログアウト処理
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
  //ログインページの表示
  public function index()
  {
    return view('admin.login.index');
  }

 //ログイン処理
  public function login(Request $request)
  {
    $credentials = $request->only(['email', 'password']);

    //ユーザー情報が見つかったらログイン
    if (Auth::guard('admins')->attempt($credentials)) {
      //ログイン後に表示するページにリダイレクト
      return redirect()->route('admin.dashboard')->with([
        'login_msg' => 'ログインしました。',
      ]);
    }

    //ログインできなかったときに元のページに戻る
    return back()->withErrors([
      'login' => ['ログインに失敗しました'],
    ]);
  }

  //ログアウト処理
  public function logout(Request $request)
  {
    Auth::guard('admins')->logout();
    $request->session()->regenerateToken();

    //ログインページにリダイレクト
    return redirect()->route('admin.login.index')->with([
      'logout_msg' => 'ログアウトしました',
    ]);
  }
}

まずindex()は何もすることがないので、ビューを表示するだけで終わっています。
ビューは、あとでresources/views/admin/login/index.blade.phpで用意する予定です。

ログイン処理login()では、まず↓で認証情報を受け取ります。

$credentials = $request->only(['email', 'password']);

その上でログインを試みます。

Auth::guard('admins')->attempt($credentials)

このログインではadminsとして設定した認証プロセスを利用するのでguard('admins')としました。

同じくログアウト処理でもguardを指定しています。

Auth::guard('admins')->logout();

もしguardを指定せずAuth::logout();としてしまうと、同時ログインしている他の認証情報(今回でいうとmypageでのログイン)も同時にログアウトしていしまうので注意が必要です。

管理画面のログインページ

次にログインページのビューを用意します。

resources/views/admin/login/index.blade.php

<html>
<head>
  <title>管理者ログイン</title>
</head>
<body>

  <h1>管理者ログイン</h1>

  @error('login')
  <p>{{ $message }}</p>
  @enderror

  <form method="POST" action="/admin/login">
    @csrf
    <label>メールアドレス</label>
    <input type="email" name="email"><br>
    <label>パスワード</label>
    <input type="password" name="password"><br>
    <button type="submit">ログイン</button>
  </form>

</body>
</html>

ログインに失敗したときに↓のようにフラッシュメッセージを設定しているので

return back()->withErrors([
  'login' => ['ログインに失敗しました'],
]);

ビュー側で表示できるように設定しています。

@error('login')
<p>{{ $message }}</p>
@enderror

管理画面トップのコントローラー

次にログイン後に表示するページを用意していきます。

コントローラーはシンプルに。

app/Http/Controllers/Admin/HomeController.php

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class HomeController extends Controller
{
  public function dashboard()
  {
    return view('admin.home.dashboard');
  }
}

ただページを表示するだけですね。

管理画面トップのビュー

コンテンツは何でもいいんですが、今回はどんなユーザーがログインしているか画面上でがわかりやすいように表示することにしました。

resources/views/admin/home/dashboard.blade.php

<html>
<head>
  <title>管理画面トップ</title>
</head>
<body>
  <h1>管理画面トップ</h1>

  @if (session('login_msg'))
  <p>{{ session('login_msg') }}</p>
  @endif

  @if (Auth::guard('admins')->check())
  <div>ユーザーID {{ Auth::guard('admins')->user()->userid }}でログイン中</div>
  @endif

  <ul>
    <li>管理者(Administrator)ログインユーザーID: {{ Auth::guard('admins')->check() }}</li>
    <li>マイページ(members) ログインユーザーID: {{ Auth::guard('members')->check() }}</li>
  </ul>

  <div>
    <a href="/admin/logout">ログアウト</a>
  </div>
</body>
</html>

ポイントは2つ。

Auth::guard('admins')->check()

ログインしてるかどうか確認するにはAuth::check()ではなく、guardをつけた形にします。
これで、なんの認証系でのログインチェックかが判別できます。

Auth::guard('admins')->user()->userid

ログイン中ユーザーの情報にアクセスするときにもguardを忘れずに。

これで一応、管理画面のログイン処理が完成しました。
ただし現状だとログインしていなくても管理画面トップを表示できてしまうので要注意
あとで調整します。

先にマイページのログイン処理も同様に作ってしまいましょう。

マイページのログイン系コントローラー

基本的に管理画面と同じく下記3つのアクションを実装します。

  • index() : ログインページの表示のみ
  • login() : ログイン処理
  • logout() : ログアウト処理

app/Http/Controllers/LoginController.php
※mypageディレクトリ内に設置していないので注意してください。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
  public function index()
  {
    return view('login.index');
  }

  public function login(Request $request)
  {
    $credentials = $request->only(['email', 'password']);

    if (Auth::guard('members')->attempt($credentials)) {
      return redirect()->route('mypage.dashboard')->with([
        'login_msg' => 'ログインしました。',
      ]);
    }

    return back()->withErrors([
      'login' => ['ログインに失敗しました'],
    ]);
  }

  public function logout(Request $request)
  {
    Auth::guard('members')->logout();
    $request->session()->regenerateToken();

    return redirect()->route('login.index')->with([
      'auth' => ['ログアウトしました'],
    ]);
  }
}

管理画面のログインと異なるのは、↓などのようにguardmembersとしている点ですね。

Auth::guard('members')->attempt($credentials)

あとはリダイレクト先ページなどを変更しているだけで、管理画面の処理と変わりません。

マイページのログインページ

こちらも管理画面と同様です。

resources/views/login/index.blade.php

<html>
<head>
  <title>マイページログイン</title>
</head>
<body>
  <h1>マイページログイン</h1>

  @error('login')
  <p>{{ $message }}</p>
  @enderror

  <form method="POST" action="/login">
    @csrf
    <label>メールアドレス</label>
    <input type="text" name="email"><br>
    <label>パスワード</label>
    <input type="password" name="password"><br>
    <button type="submit">ログイン</button>
  </form>

</body>
</html>

マイページトップのコントローラー

マイページにログインしたあとに表示するページのコントローラーです。

app/Http/Controllers/Mypage/HomeController.php

<?php

namespace App\Http\Controllers\Mypage;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class HomeController extends Controller
{

  public function dashboard()
  {
    return view('mypage.home.dashboard');
  }
}

マイページトップのビュー

こちらも管理画面と同様。

resources/views/mypage/home/dashboard.blade.php

<html>
<head>
  <title>マイページトップ</title>
</head>
<body>
  <h1>マイページトップ</h1>

  @if (session('login_msg'))
  <div class="alert alert-success">
    {{ session('login_msg') }}
  </div>
  @endif

  @if (Auth::guard('members')->check())
  <div>ユーザーID {{ Auth::guard('members')->user()->userid }}でログイン中</div>
  @endif

  <ul>
    <li>管理者(Administrator)ログインユーザー: {{ Auth::guard('admins')->check() }}</li>
    <li>マイページ(members) ログインユーザー: {{ Auth::guard('members')->check() }}</li>
  </ul>

  <div>
    <a href="/logout">ログアウト</a>
  </div>

</body>
</html>

フロントページのコントローラー

最後に、比較用としてログインが必要なくても表示できるページを用意します。

app/Http/Controllers/HomeController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
  public function top()
  {
    return view('home.top');
  }
}

単にページを表示するだけですね。

フロントページのビュー

こちらもさっくり用意してしまいましょう。

resources/views/home/dashboard.blade.php

<html>
<head>
  <title>トップページ</title>
</head>
<body>
  <h1>トップページ</h1>
  <ul>
    <li>管理者(Administrator)ログインユーザー: {{ Auth::guard('admins')->check() }}</li>
    <li>マイページ(members) ログインユーザー: {{ Auth::guard('members')->check() }}</li>
  </ul>
</body>
</html>

マルチ認証に必要なミドルウェアを設定する

これで一連のログイン処理は実装できましたが、まだ「ログインできるだけ」です。
ログインしていてもしてなくても同じページが閲覧できてしまいます。

そこでミドルウェアを使って、ログイン状態に基づくページ表示を調整することが必要です。

ミドルウェアとは、アプリケーションへ送信されたHTTPリクエストをフィルタリングするもの。
今回の認証プロセスにおいて、ログインしているか・していないかで振る舞いを変えるのにちょうどよい仕組みです。

管理画面系のミドルウェア設定

すでに認証用のミドルウェアが用意されているので、まずは管理画面のログインに関係する処理を記載してしまいましょう。

app/Http/Middleware/Authenticate.php

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
  /**
   * Get the path the user should be redirected to when they are not authenticated.
   *
   * @param  \Illuminate\Http\Request  $request
   * @return string|null
   */
  protected function redirectTo($request)
  {
    return route('admin.login.index');
  }
}

redirectTo($request) の中身を書き換えました。
ログインが必要なページにログインしていない状態でアクセスしてしまった場合に、リダイレクトする先を設定しています。

あわせてルーティング設定において、ログインが必要なページを指定します。

routes/admin.php に追記

Route::prefix('admin')->middleware('auth:admins')->group(function () {
  Route::get('/', [HomeController::class, 'dashboard'])->name('admin.dashboard');
});

middleware('auth:admins')を経由するページを指定しました。
これで、ログインしていない状態で管理画面トップにアクセスできない状態です。

一方、ログインしている状態でもログインページにアクセスできてしまうので、Admin/LoginControllerindex()を調整します。

app/Http/Controllers/Admin/LoginController.php

public function index()
{
  if (Auth::guard('admins')->user()) {
    return redirect()->route('admin.dashboard');
  }

  return view('admin.login.index');
}

3〜5行目を追記。
ログイン中ユーザーが見つかったとき(=ログイン中であれば)管理画面のトップページにリダイレクトします。

マイページ系のミドルウェア設定

続いて同じミドルウェアにマイページ系の処理も記載してしまうことはできますが、わかりにくくなるので別ファイルにて管理することをおすすめします。

app/Http/Kernel.phpの最下部にある$routeMiddlewareに、新しい認証用のミドルウェアを追加しました。

protected $routeMiddleware = [
  'auth' => \App\Http\Middleware\Authenticate::class,
  'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
  'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
  'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
  'can' => \Illuminate\Auth\Middleware\Authorize::class,
  'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
  'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
  'signed' => \App\Http\Middleware\ValidateSignature::class,
  'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
  'auth.members' => \App\Http\Middleware\MemberAuthenticate::class,   //ここを追加
];

その上で、新しいミドルウェアのファイルを作成します。

app/Http/Middleware/MemberAuthenticate.php

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class MemberAuthenticate extends Middleware
{
  /**
   * Get the path the user should be redirected to when they are not authenticated.
   *
   * @param  \Illuminate\Http\Request  $request
   * @return string|null
   */
  protected function redirectTo($request)
  {
    return route('login.index');
  }
}

Authenticate.phpとほぼ同じで、変わったところは2点だけです。
7行目のクラス名と、17行目のリダイレクト先のみ変えればOK。

次に、マイページのルーティング設定を調整します。

routes/mypage.phpに追記。

Route::prefix('mypage')->middleware('auth.members:members')->group(function () {
  Route::get('/', [HomeController::class, 'dashboard'])->name('mypage.dashboard');
});

こちらも同じように、ログイン中でないと見えないようにするページを設定します。

1行目でmiddleware('auth.members:members')としている点に注意してください。
middleware('auth:members')ではありません。

最後に、ログイン中であればログインページが表示できないようにコントローラー側で設定します。

app/Http/Controllers/LoginController.phpindex()を調整。

public function index()
{
  if (Auth::guard('members')->user()) {
    return redirect()->route('mypage.dashboard');
  }

  return view('login.index');
}

3〜5行目を追記しました。

これでマルチ認証は完成です。

マルチ認証の設定方法まとめ

マルチ認証は複雑に見えますが、手順を追って設定していけばさほど難しくはありません。

  1. 認証用のモデル・マイグレーションを作成
  2. ルーティング設定
  3. app/config.phpでガードとプロバイダーを設定
  4. コントローラーのログイン処理を実装
  5. ビュー作成
  6. ミドルウェア設定

の順で作業していけば、実装方法もわかりやすいですね。

ぜひこの記事をLaravelでの開発に役立ててください。

マルチ認証の実装方法

この記事が気に入ったら
いいね または フォローしてね!

SHARE
  • URLをコピーしました!

コメント

コメントする

目次