【Laravel】ユーザー権限:管理者を作成してアクセス制限を行う

時計 2023.12.03 / 時計

【Laravel】ユーザー権限:管理者を作成してアクセス制限を行う

記事ではLaravel管理者(Administrator)のユーザー権限を作成してアクセス制限を行う方法について解説していきます。

LaravelによるWebアプリケーションでログインでの認証機能を実装している場合、誰もがユーザー登録など管理者が行うべきページにアクセスできることは好ましくないです。

ここではユーザーテーブルに権限のフィールドを追加して、管理者のみが特定のページにアクセスできるアクセス制御を行います。

本記事を通して、ユーザーの権限によるアクセス制御を行う方法について理解を深めてください。

本記事ではLaravel10を使って開発を進めています。

事前準備

事前準備として使用するパソコンにLaravelの環境が整っている必要があります。まだ環境が整っていない方は以下記事を参考にして開発環境を構築してください。

ここでは使用するプロジェクトに認証機能が構築されていることを前提として話を進めていきます。本記事ではLaravel Breezeをインストールしたプロジェクトを使用しています。

Laravel用語の確認

Laravel Breezeとは最小限の認証機能をWebアプリケーションに実装できるパッケージです。とてもシンプルであり、ログインやユーザー登録、パスワードリセット、メール認証といったWebアプリケーションに必要不可欠な基本的な認証機能を提供します。

同じようにプロジェクトにLaravel Breezeをインストールして進めたい方は以下記事をご参照ください。

管理者を作成してアクセス制限を行う方法

Webアプリケーションに管理者を作成してアクセス制御を行う方法として、ここでは最初から用意されているusersテーブルにカラムroleを追加してユーザーの権限を管理します。

ログインしたユーザーが管理者かどうかはミドルウェアによって判定します。

開発の流れは以下の通りです。

  1. usersテーブルにユーザー権限用のカラムを追加
  2. ミドルウェアの作成と登録
  3. ルートにミドルウェアを設定

Laravelをマイグレーションした時点で作成されるusersテーブルは以下のようなカラム構成となっています。

名前 タイプ
id bigint
name varchar
email varchar
email_verified_at timestamp
password varchar
remember_token varchar
created_at timestamp
updated_at timestamp
Laravel:usersテーブル

上記のusersテーブルを利用して管理者のアクセス制限ができるようにしていきます。

usersテーブルにユーザー権限用のカルムを追加

まずはusersテーブルにユーザー権限用のカルムを作成します。

権限を入れるためのカルムを追加するためのマイグレーションファイルは以下コマンドを実行して作成します。

php artisan make:migration add_role_column_to_users_table --table=users

上記コマンドを実行するとdatabase/migrationsの中に
(日付)_add_role_column_to_users_table.phpが作成されます。中身は次のようになっています。

<?php

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

return new class extends Migration
{
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
        });
    }

    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
        });
    }
};

ここにカラム「role」を追加するコードを以下のように記述します。

return new class extends Migration
{
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('role')->after('name')->nullable(); //追記
        });
    }

    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('role'); //追記
        });
    }
};

カラム「role」はafter('name')によってカラムnameの後に作成され、nullable()によってNULL値を許容するようになります。

次に以下コマンドでマイグレーションを実行し、usersテーブルにカラムroleの追加を適用します。

php artisan migrate

上記コマンドでusersテーブルにカラムroleが追加されました。

Laravel:usersテーブルにroleを追加

このroleに管理者を表す「admin」や「administrator」を登録して、管理者とそうでないユーザーを見分けられるようにします。ここでは既存のユーザーのroleに「admin」と登録しておきます。

Laravel:roleをadminで登録

ミドルウェアの作成と登録

usersテーブルに役割を入れるカラムroleを作成したら、次に管理者のみが特定のページを見られるようにするミドルウェアを作成します。以下コマンドを実行してミドルウェアを作成します。

php artisan make:middleware AdminAllowMiddleware

app/Http/Middleware内に「AdminAllowMiddleware.php」が作成されています。中身は以下のように記述されています。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class AdminAllowMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        return $next($request);
    }
}

AdminAllowMiddlewareクラスのhandleに以下のようにコードを追記します。

public function handle(Request $request, Closure $next): Response
{
    if(auth()->user()->role == 'admin') {
        return $next($request);
    }

    return redirect()->route('home'); //admin以外はhomeにリダイレクトする
}

ここではログインユーザーのroleがadminであればリクエストを実行し、それ以外のユーザーはhomeへリダイレクトするミドルウェアとなっています。

作成したミドルウェアはapp/Http/Kernel.php内の$middlewareAliasesに追記します。ここでは「admin」という名前で追記しています。

protected $middlewareAliases = [
    …
    'admin' => \App\Http\Middleware\AdminAllowMiddleware::class,
];

ルートにミドルウェアを設定

作成したミドルウェアをroutes/web.phpやauth.phpに適用して、admin権限をもったユーザー以外が該当ルートにアクセスできないようにします。

ここではauth.phpの以下ルートにミドルウェアを適用します。

Route::get('register', [RegisteredUserController::class, 'create'])
    ->middleware('admin')
    ->name('register');

上記により、roleがadminのユーザーのみがregisterにアクセスすることができるようになります。