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行目です。
認証に使うため Authenticatable
をuse
してください。
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
最後に作成したUserSeeder
・AdminSeeder
を呼び出せるように、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.php
とmypage.php
をinclude
するのを忘れずに。
<?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
として設定することにしました。
マルチ認証に必要なコントローラー・ビューの作成
ガードとプロバイダを設定したことでadmins
とmembers
の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' => ['ログアウトしました'],
]);
}
}
管理画面のログインと異なるのは、↓などのようにguard
をmembers
としている点ですね。
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/LoginController
のindex()
を調整します。
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.php
のindex()
を調整。
public function index()
{
if (Auth::guard('members')->user()) {
return redirect()->route('mypage.dashboard');
}
return view('login.index');
}
3〜5行目を追記しました。
これでマルチ認証は完成です。
マルチ認証の設定方法まとめ
マルチ認証は複雑に見えますが、手順を追って設定していけばさほど難しくはありません。
- 認証用のモデル・マイグレーションを作成
- ルーティング設定
- app/config.phpでガードとプロバイダーを設定
- コントローラーのログイン処理を実装
- ビュー作成
- ミドルウェア設定
の順で作業していけば、実装方法もわかりやすいですね。
ぜひこの記事をLaravelでの開発に役立ててください。
コメント