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

时间:2017-10-02 07:42:29

标签: laravel laravel-5.5

我有一个超级简单的学习应用程序。我的Laravel版本是5.5.13User可以创建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}

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

如果不可能,请您告诉我如何在控制器中明确执行此操作?我这样做,但我不认为这是推荐的方式吗?

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;
}

1 个答案:

答案 0 :(得分:2)

更多以Laravel为中心的方式使用policies

然后,对于您要授权的每个操作,请在策略中注册它们。您的show方法将成为:

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

    return $pet;
}

所以你的步骤是:

  • 制定新的宠物政策
  • 添加您要授权的操作
  • AuthServiceProvider
  • 中注册政策
  • 使用authorize 在您的Controller操作中调用