Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜

Laravelは、PHPでWebアプリケーションやAPIを簡単に構築できる人気のフレームワークです。

Laravelには、認証システムがデフォルトで含まれており、ユーザー認証を簡単に実装できます。

しかし、プロジェクトによっては、管理者とユーザーの異なる認証方法が必要になることがあります。

この記事では、Laravelでマルチ認証を実装する方法について説明します。

とびうおくん
とびうおくん

Laravelでマルチ認証を実装して、

管理者とユーザーの異なる認証方法を提供しましょう!

マルチ認証の準備

まず、新しいLaravelプロジェクトを作成し、必要なパッケージをインストールします。

次に、UserモデルとAdminモデルを作成し、それぞれのテーブルを設定します。

Adminモデルのマイグレーションファイルを作成し、データベースに適用します。

php artisan make:model Admin -m
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
とびうおくん
とびうおくん

マルチ認証の準備は簡単ですね!

次に、管理者用の認証コントローラを作成しましょう。

管理者用マイグレーションファイルの編集

作成されたマイグレーションファイルを編集し、adminsテーブルの構造を定義します。

以下の例では、nameemailpasswordなどの基本的なカラムを設定しています。

<?php

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

class CreateAdminsTable extends Migration
{
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('admins');
    }
}
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜

マイグレーションの実行

編集が完了したら、以下のコマンドを実行してマイグレーションを実行し、adminsテーブルをデータベースに作成します。

php artisan migrate
とびうおくん
とびうおくん

れで、管理者用のマイグレーションファイルの作成と編集が完了しました!

データベースにadminsテーブルが作成され、管理者情報を保存できるようになります。

これを使用して、管理者用の認証機能を実装していきましょう。

管理者用認証コントローラの作成

管理者用の認証コントローラを作成し、ログイン・ログアウト機能を実装します。

php artisan make:controller Admin\Auth\LoginController
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜

LoginControllerに、AuthenticatesUsersトレイトを使用し、必要なメソッドをオーバーライドしてカスタマイズします。以下は、一例です。

use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    use AuthenticatesUsers;
protected $redirectTo = '/admin/dashboard';

public function __construct()
{
    $this->middleware('guest:admin')->except('logout');
}

protected function guard()
{
    return Auth::guard('admin');
}

public function showLoginForm()
{
    return view('admin.auth.login');
}

public function login(Request $request)
{
    $request->validate([
        'email' => 'required|string|email',
        'password' => 'required|string',
    ]);

    if (Auth::guard('admin')->attempt($request->only('email', 'password'), $request->filled('remember'))) {
        return redirect()->intended(route('admin.dashboard'));
    }

    return back()->withInput($request->only('email', 'remember'));
}

public function logout(Request $request)
{
    $this->guard()->logout();
    $request->session()->invalidate();
    return $this->loggedOut($request) ?: redirect('/admin/login');
}
}
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
とびうおくん
とびうおくん

管理者用認証コントローラを作成しました!

次に、ミドルウェアを作成していきましょう。

ミドルウェアの作成

カスタムガードを使用するために、新しいミドルウェアを作成します。

php artisan make:middleware RedirectIfAuthenticated
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜

新しく作成したミドルウェアで、リダイレクト先をカスタマイズします。

public function handle(Request $request, Closure $next, ...$guards)
{
    $guards = empty($guards) ? [null] : $guards;

    foreach ($guards as $guard) {
        if (Auth::guard($guard)->check()) {
            return $guard === 'admin' ? redirect('/admin/dashboard') : redirect('/home');
        }
    }

    return $next($request);
}
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
とびうおくん
とびうおくん

ミドルウェアができました!

これで、認証済みのユーザーが適切なリダイレクト先に送られます。

カスタムガードの設定

config/auth.phpファイルに新しいカスタムガードを追加しましょう。

この例では、adminガードを追加します。

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

次に、新しいユーザープロバイダを追加します。

これにより、adminsテーブルから管理者データを取得できます。

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
    ],
],
とびうおくん
とびうおくん

ここでカスタムガードを設定しました!

これで、管理者用のログイン機能が実装されます。

ルーティングの設定

次に、管理者用のルーティングを設定します。routes/web.phpファイルに、以下のようにルートを追加します。

Route::prefix('admin')->namespace('Admin')->middleware('guest:admin')->group(function () {
    Route::get('/login', 'Auth\LoginController@showLoginForm')->name('admin.login');
    Route::post('/login', 'Auth\LoginController@login');
    Route::post('/logout', 'Auth\LoginController@logout')->name('admin.logout');
});

Route::middleware('auth:admin')->prefix('admin')->namespace('Admin')->group(function () {
    Route::get('/dashboard', 'DashboardController@index')->name('admin.dashboard');
});
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
とびうおくん
とびうおくん

ルーティングが設定されました!

これで、管理者用のログイン画面やダッシュボードにアクセスできます。

ビューの作成

最後に、管理者用のログイン画面を作成します。

resources/views/admin/auth/login.blade.phpファイルを作成し、ログインフォームを追加します。

<!-- resources/views/admin/auth/login.blade.php -->
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Admin Login') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('admin.login') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <div class="col-md-6 offset-md-4">
                                <div class="form-check">
                                    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

                                    <label class="form-check-label" for="remember">
                                        {{ __('Remember Me') }}
                                    </label>
                                </div>
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-8 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Login') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
Laravelでのマルチ認証 〜管理者とユーザーの異なる認証方法の実装〜
とびうおくん
とびうおくん

これで管理者用のログイン画面が作成されました!

これでマルチ認証の実装がほぼ完了です。

まとめ

この記事では、Laravelで管理者とユーザーの異なる認証方法を実装する方法について説明しました。これにより、管理者とユーザーがそれぞれのダッシュボードにアクセスできるようになります。

Laravelでマルチ認証を実装することで、アプリケーションのセキュリティとユーザー体験を向上させることができます。

他のLaravelの記事

トビログではこれ以外にも多くのLaravelの記事を公開しています!ぜひご覧ください!

Laravel
「Laravel」の記事一覧です。
とびちゃん
とびちゃんは最新のAI技術を併用しながら記事を書く子です!とってもいい子!

コメント

タイトルとURLをコピーしました