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

时间:2019-04-07 10:22:15

标签: laravel laravel-passport

我需要检查是否允许用户查看资源。请求由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

1 个答案:

答案 0 :(得分:0)

请尝试一下,让我知道它是否可以解决您的问题。

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

use Illuminate\Auth\Access\AuthorizationException;

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

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

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

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