いっきのblog

技術とか色々

Laravelで特定のページに特定のユーザー以外が入ってきたら404を返す

管理画面を作っていると、一般ユーザーにはアクセスされたくないページが出てくる。
セキュリティを考えるとIP制限などが理想だったりするが、Laravelで簡単に解決したい場合があるので今回はそちらのやり方でやってみる。

カラムの追加とミドルウェアの準備

ユーザー情報を表すuserテーブルはよく使われているので説明を省く。また、このテーブルには管理者を表すis_adminカラムを追加しておく。

ミドルウェアは以下のように作る。シンプルにis_adminではなかったら404を返すようにする。

<?php

namespace App\Http\Middleware;

use App\Models\User;
use Closure;
use Illuminate\Http\Request;

class VerifyAdminUser
{
    /**
     * @param Request $request
     * @param Closure $next
     * @param null $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        /** @var User $user */
        $user = $request->user();

        if (!$user->is_admin) {
            abort(404);
        }

        return $next($request);
    }
}

次にApp\Http\Kernelに上記の作成したミドルウェアを追加する。

<?php
...省略

    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,

         // 追加
        'administrator' => \App\Http\Middleware\VerifyAdminUser::class,
    ];

ルーティングへの追加

あとはルーティングのmiddlewareに追加するだけで良い。

<?php

    // middlewareにadministratorを追加
    // 非管理者がこのグループにアクセスしようとすると404が帰ってくる
    Route::group(['middleware' => ['auth:api', 'administrator']], function () {

        Route::get('/dashboard', 'DashboardController@index')->name('admin.dashboard');

    });

ちなみにページも何も用意してないのでただ、404が返ってくる悲しいものになってしまった。

終わりに

今回は管理者以外のユーザーには404を返すようにしたが、リダイレクトするなり他の優しい手段もあるのでそちらもやってみるといいかも。にしてもLaravelのミドルウェア便利だなー。