sanctumで特定の権限を持つユーザー以外からのapi呼び出しをブロックする

ログインしているユーザーにしか触らせない処理(カレントユーザーのアカウント情報の編集を行うとか)はよくあるが、

特定の権限を持つユーザーにしか触らせたくないAPIはどうガードをかければいいかについて解説。

例えば、

管理者用のアカウントでログインしている場合のみ、

他のユーザーのパスワードを上書き変更できるメソッドをAPIから呼び出せるようにする

みたいな感じ。

今回はログイン中のユーザーにおける、データベースのroleカラムの値がadminだったら、そのAPIの呼び出しを許可する

みたいな感じにしてくいく。

Sanctumがすでに実装されている前提で話を進める。

カスタムミドルウェアの作成:

php artisan make:middleware CheckAdmin

app/Http/Middleware/CheckAdmin.phpが生成される。

ミドルウェアの実装:

// app/Http/Middleware/CheckAdmin.php

namespace App\\Http\\Middleware;

use Closure;
use Illuminate\\Http\\Request;
use Illuminate\\Support\\Facades\\Auth;

class CheckAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \\Illuminate\\Http\\Request  $request
     * @param  \\Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $user = Auth::user();
                //ログイン中のユーザーのroleカラムがadminなら
        if ($user && $user->role == 'admin') {
            return $next($request);
        }

        return response()->json(['error' => 'Unauthorized'], 403);
    }
}

ミドルウェアをルートミドルウェアに登録:

// app/Http/Kernel.php

protected $routeMiddleware = [
    ...
    'checkAdmin' => \\App\\Http\\Middleware\\CheckAdmin::class,//追記
    ...
];

ミドルウェアをルートに適用:

// routes/api.php

Route::middleware(['auth:sanctum', 'checkAdmin'])->group(function(){
    Route::post('/change-password-by-admin', [HogeController::class, 'HogeMethod']);//管理者にしか使わせたくないメソッドを呼び出し
});

このようにすることで、/change-password-by-adminエンドポイントへのアクセスは、管理者権限を持つユーザーに限定されます。それ以外のユーザーは403エラー(Unauthorized)を受け取ります。

無制限に質問可能なプログラミングスクール!

万が一転職できない場合は、転職保障全額返金できるコースもあり!!

無制限のメンター質問対応

 

DMMウェブキャンプでプログラミングを学習しませんか?

独学より成長スピードをブーストさせましょう!

 

まずは無料相談から!

おすすめの記事