【Laravel】ユーザー権限:管理者を作成してアクセス制限を行う
2023.12.03 /
本記事ではLaravelで管理者(Administrator)のユーザー権限を作成してアクセス制限を行う方法について解説していきます。
LaravelによるWebアプリケーションでログインでの認証機能を実装している場合、誰もがユーザー登録など管理者が行うべきページにアクセスできることは好ましくないです。
ここではユーザーテーブルに権限のフィールドを追加して、管理者のみが特定のページにアクセスできるアクセス制御を行います。
本記事を通して、ユーザーの権限によるアクセス制御を行う方法について理解を深めてください。
本記事ではLaravel10を使って開発を進めています。
事前準備
事前準備として使用するパソコンにLaravelの環境が整っている必要があります。まだ環境が整っていない方は以下記事を参考にして開発環境を構築してください。
【Laravel】Windowsにインストールして開発環境を構築する方法
ここでは使用するプロジェクトに認証機能が構築されていることを前提として話を進めていきます。本記事ではLaravel Breezeをインストールしたプロジェクトを使用しています。
Laravel Breezeとは最小限の認証機能をWebアプリケーションに実装できるパッケージです。とてもシンプルであり、ログインやユーザー登録、パスワードリセット、メール認証といったWebアプリケーションに必要不可欠な基本的な認証機能を提供します。
同じようにプロジェクトにLaravel Breezeをインストールして進めたい方は以下記事をご参照ください。
【Laravel】認証機能のLaravel Breezeとは:インストール方法や機能について
管理者を作成してアクセス制限を行う方法
Webアプリケーションに管理者を作成してアクセス制御を行う方法として、ここでは最初から用意されているusersテーブルにカラムroleを追加してユーザーの権限を管理します。
ログインしたユーザーが管理者かどうかはミドルウェアによって判定します。
開発の流れは以下の通りです。
- usersテーブルにユーザー権限用のカラムを追加
- ミドルウェアの作成と登録
- ルートにミドルウェアを設定
Laravelをマイグレーションした時点で作成されるusersテーブルは以下のようなカラム構成となっています。
名前 | タイプ |
---|---|
id | bigint |
name | varchar |
varchar | |
email_verified_at | timestamp |
password | varchar |
remember_token | varchar |
created_at | timestamp |
updated_at | timestamp |
上記の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が追加されました。
このroleに管理者を表す「admin」や「administrator」を登録して、管理者とそうでないユーザーを見分けられるようにします。ここでは既存のユーザーの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にアクセスすることができるようになります。