隐式路由模型绑定 401 未经授权

Implicit route model binding 401 unauthorized

我有一个超级简单的学习应用程序。我的 Laravel 版本是 5.5.13。一个 User 可以创建一个 Pet。我隐含地抛出 404 但我还需要隐含地抛出 401 这可能吗?

设置详情:

Pet 型号:

class Pet extends Model
{
    protected $fillable = ['name', 'user_id'];

    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

User模型给出关系hasMany:

class User extends Authenticatable
{
    use Notifiable;

    // ... some stuff hidden for brevity

    public function pets()
    {
        return $this->hasMany('App\Pet');
    }
}

我使用隐式路由模型绑定在找不到 id 时抛出 404 状态,如下所示:

Route::group(['middleware' => 'auth:api'], function() {
    Route::get('pets', 'PetController@index');
    Route::get('pets/{pet}', 'PetController@show');
    Route::post('pets', 'PetController@store');
    Route::put('pets/{pet}', 'PetController@update');
    Route::delete('pets/{pet}', 'PetController@delete');
});

注意 {pet} 而不是 {id}

但是,如果 $pet->user_id 不等于 Auth::guard('api')->user()->id,我也想抛出 401 未授权状态。这隐含可能吗?

如果不可能,你能告诉我如何在控制器中明确地做到这一点吗?我正在这样做,但我认为这不是推荐的方式,是吗?

public function show(Pet $pet)
{
    if ($pet->user_id != Auth::guard('api')->user()->id) {
        return response()->json(['message'=>'Not authenticated to view this pet'], 401);
    }
    return $pet;
}

更 Laravel 中心的方法是使用 policies

然后,对于您想要授权的每项操作,您都将它们注册到您的政策中。您的 show 方法将变为:

public function show(Pet $pet)
{
    $this->authorize('show', $pet);

    return $pet;
}

所以你的步骤是:

  • 为宠物创建新政策
  • 添加您要授权的操作
  • AuthServiceProvider
  • 中注册策略
  • 使用authorize 在你的控制器动作中调用