OHTA412

middlewareを追加して管理者権限ユーザーのみアクセスを許可する

Lavavelにmiddlewareを新しく追加して、管理者権限ユーザーのみアクセスを許可する機能の例です。ユーザー情報はusersテーブルで管理しており、roleというカラムで管理者権限の有無を判定します。

ユーザーに管理者権限を判定するカラムを追加

usersテーブルにroleというカラムを追加します。管理者権限のユーザーにはそのカラムにadminという文字列を入れるようにします。管理者権限でない場合は何も入らないので、nullableにしておきます。

// database/migrations/20xx_xx_xx_000000_create_useres_table.php

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('role')->nullable(); // この行を追加
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

ミドルウェアの作成

artisanコマンドを使って、新しいミドルウェアを作成します。今回はCheckAdminという名前にします。

php artisan make:middleware CheckAdmin

上記コマンドを実行すると、app/Http/Middlewareディレクトリ内にCheckAdmin.phpというファイルが作成されます。ファイル内のhandleメソッドを下記コードのように書き換えます。

// app/Http/Middleware/CheckAdmin.php

use Illuminate\Support\Facades\Auth;

…略…

public function handle($request, Closure $next)
{
    if (Auth::user()->role !== 'admin') {
        return redirect()->route('home');
    }

    return $next($request);
}

9~11行目で、ログインしているユーザーのroleカラムがadminでない場合は、homeにリダイレクトさせています。adminユーザーのみ13行目に到達でき、このmiddlewareを通過できます。

このとき、ログインしているユーザー情報を取得するためにAuthファサードも使用します。3行目でuseしています。

ミドルウェアの登録

先ほど作成したミドルウェアを使用できるように登録します。

app/Httpディレクトリ内にKarnel.phpというファイルがあります。そのファイル内に$routeMiddlewareが設定されているので、そこに先ほど作成したミドルウェアを追記します。

// app/Http/Karnel.php:53行目付近

protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\CheckAdmin::class, // この行を追加
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::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' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

これで、adminという名前でミドルウェアが使えるようになりました。

ルートでミドルウェアを使う

「ユーザーに関するルートは管理者権限でログインしたときのみアクセスできるようにしたい」といった場合は、下記コードのようになります。

// routes/web.php

Route::resource('user', 'UserController')->middleware(['auth', 'admin']);