我有一个超级简单的学习应用程序。我的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}
。
但是,如果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;
}
答案 0 :(得分:2)
更多以Laravel为中心的方式使用policies。
然后,对于您要授权的每个操作,请在策略中注册它们。您的show
方法将成为:
public function show(Pet $pet)
{
$this->authorize('show', $pet);
return $pet;
}
所以你的步骤是:
AuthServiceProvider
authorize
在您的Controller操作中调用