我创建了一个策略来保护我的模型。我想做的是阻止任何人编辑不存在的想法记录。
web.php
Auth::routes();
Route::prefix('/')->middleware(['auth','can:viewAny,App\ThoughtRecord'])->group(function() {
Route::get('/record/{id}/edit', 'ThoughtRecordController@edit')->middleware('can:isOwner,App\ThoughtRecord');
Route::patch('/record/{thoughtRecord}','ThoughtRecordController@update')->middleware('can:isOwner,App\ThoughtRecord');
});
ThoughtRecordPolicy.php
public function isOwner(User $user, ThoughtRecord $thoughtRecord)
{
return $user->id == $thoughtRecord->user_id;
}
->middleware(['auth','can:viewAny,App\ThoughtRecord'])
可以正常工作。其他路由上的中间件没有经过->middleware('can:isOwner,App\ThoughtRecord')
并产生此错误:
错误
Symfony \ Component \ Debug \ Exception \ FatalThrowableError 函数App \ Policies \ ThoughtRecordPolicy :: isOwner()的参数太少,在/Applications/MAMP/htdocs/thought-records/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php中传递了1恰好是2个
编辑:
我将路线更改为:
Route::get('/record/{thoughtRecord}/edit', 'ThoughtRecordController@edit')->middleware('can:isOwner,thoughtRecord');
现在我得到403的条件是我相当肯定。
答案 0 :(得分:1)
您错误地将第二个参数传递给isOwner
策略的方法。
以下方法应该起作用:
Route::get('/record/{thoughtRecord}/edit', 'ThoughtRecordController@edit')->middleware('can:isOwner,thoughtRecord');
在此示例中,我们传递了can中间件两个参数。第一个是我们希望授权的操作的名称,第二个是我们希望传递给策略方法的route参数。在这种情况下,由于我们使用的是隐式模型绑定,因此Post模型将传递给policy方法。
因此,您基本上需要使用隐式模型绑定,并将route参数作为第二个参数传递。
希望有帮助!