Неявная привязка модели маршрута 401 неавторизованная

У меня есть очень простое обучающее приложение. Моя версия 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');
    }
}

Я использовал неявную привязку модели маршрута, чтобы выдать статус 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;
}

person Blagoh    schedule 02.10.2017    source источник
comment
С другой стороны, если вы посмотрите на маршруты ресурсов, вам не нужно определять все маршруты, как вы сделали выше, все это может быть обработано Laravel.   -  person mic    schedule 02.10.2017


Ответы (1)


Более ориентированный на Laravel способ сделать это — использовать политики.

Затем для каждого действия, которое вы хотите авторизовать, вы регистрируете их в своей политике. Тогда ваш метод show станет таким:

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

    return $pet;
}

Таким образом, ваши шаги будут такими:

  • Создать новую политику для домашних животных
  • Добавьте действия, которые вы хотите разрешить
  • Зарегистрируйте политику в AuthServiceProvider
  • Используйте вызов authorize внутри действия контроллера.
person Leon Vismer    schedule 02.10.2017
comment
Это работает потрясающе, сэр! Он даже выдает 403, что лучше, чем то, что я хотел, я решил выбросить 401, спасибо!! - person Blagoh; 02.10.2017