Laravelでロール・権限別ミドルウェアを作成する方法!初心者向け解説
生徒
「先生、Laravelで管理者だけがアクセスできるページを作りたいです。」
先生
「その場合は、ロールや権限に応じてアクセスを制御するミドルウェアを作ると便利です。」
生徒
「ロールや権限って何ですか?」
先生
「ロールとはユーザーの役割のことです。例えば『管理者(admin)』や『一般ユーザー(user)』です。権限はそのロールに付与された操作の範囲を指します。」
生徒
「なるほど。ミドルウェアでどうやって制御するんですか?」
先生
「実際にコードを書きながら見ていきましょう。」
1. ミドルウェアの作成
まずは、ターミナルでミドルウェアを作成します。以下のコマンドを実行してください。
php artisan make:middleware RoleMiddleware
このコマンドで app/Http/Middleware/RoleMiddleware.php が作成されます。
2. ミドルウェアの編集
次に、作成したミドルウェアにロールチェックの処理を追加します。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RoleMiddleware
{
public function handle(Request $request, Closure $next, $role)
{
$user = Auth::user();
if (!$user || $user->role !== $role) {
abort(403, 'アクセス権限がありません。');
}
return $next($request);
}
}
ここでは $role を引数として受け取り、ユーザーのロールと比較しています。もし一致しなければ 403 Forbidden を返します。
3. ミドルウェアの登録
作成したミドルウェアは app/Http/Kernel.php に登録します。
protected $routeMiddleware = [
// 既存のミドルウェア
'role' => \App\Http\Middleware\RoleMiddleware::class,
];
これでルートで role ミドルウェアを利用できるようになります。
4. ルートでの利用例
管理者専用ページにミドルウェアを適用する場合、以下のようにルートに指定します。
Route::get('/admin/dashboard', 'AdminController@index')
->middleware('role:admin');
この設定により、role が admin のユーザーだけがアクセス可能になります。
5. 複数ロールに対応する場合
複数のロールにアクセスを許可したい場合は、カンマ区切りで指定できます。ミドルウェア側も少し修正が必要です。
public function handle(Request $request, Closure $next, ...$roles)
{
$user = Auth::user();
if (!$user || !in_array($user->role, $roles)) {
abort(403, 'アクセス権限がありません。');
}
return $next($request);
}
Route::get('/dashboard', 'DashboardController@index')
->middleware('role:admin,editor');
この例では admin と editor がアクセス可能です。
6. 注意点
- ユーザーに
roleカラムが存在することが前提です。 - 複雑な権限管理が必要な場合はパッケージ(例:Spatie Laravel Permission)を利用するのもおすすめです。
- 必ず
Auth::user()でログインユーザーを取得する - 未ログインユーザーは
403または401を返す
7. 実践応用
このロール・権限ミドルウェアを使うと、管理者用ページ、編集者用ページ、一般ユーザー用ページなどを簡単に制御できます。アクセス制御の基本を理解しておくと、Laravelでのセキュリティ設計がより安全になります。