
ログインしているユーザーにしか触らせない処理(カレントユーザーのアカウント情報の編集を行うとか)はよくあるが、
特定の権限を持つユーザーにしか触らせたくない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)を受け取ります。