如何通过 Laravel 中的中间件使用 API 授权用户拥有资源?

How to authorize user owns resource using API through middleware in Laravel?

我需要检查是否允许用户查看资源。请求由 API 发送并通过 auth:api 中间件。我正在使用 Laravel 5.8

我试过像这样在路由声明中使用中间件:

Route::get('/user/{id}', 'UserController@get')->middleware('can:view,user')

或者在方法的控制器代码中这样:

$user = Auth::guard('api')->user();
$this->authorize('view', $user, $anotherUserModel);

这些方法中的每一个要么让用户通过策略,即使它被硬编码以阻止用户表单实现此目的,要么抛出错误:

{
    "message": "This action is unauthorized.",
    "exception": "Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException",
    "file": "C:\xampp\htdocs\laravelapitest\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php",
    "line": 202,
    [...]
}

但我希望用户应该停止并且响应代码应该是 403

你能试一试吗,如果它能解决你的问题,请告诉我。

转到 App\Exceptions 文件夹并在 Handler.php 文件的顶部添加以下内容:

use Illuminate\Auth\Access\AuthorizationException;

将以下内容添加到同一文件中的 $dontReport 数组中:

\Illuminate\Auth\Access\AuthorizationException::class,

最后一步是通过在渲染函数中添加以下代码来自定义错误响应:

if ($exception instanceof AuthorizationException) {
    return response()->json('unauthorized',403);
}