隐式路由模型绑定 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
在你的控制器动作中调用
我有一个超级简单的学习应用程序。我的 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
在你的控制器动作中调用