我使用以下两个操作在laravel 5.3中创建了一个策略:
class ProjectPolicy {
...
public function index(User $user)
{
return true;
}
public function create(User $user)
{
return true;
}
...
}
然后我尝试通过路由组中间件进行授权:
Route::group(['middleware' => ['can:index,create,App\Project']], function () {
Route::resource('projects', 'ProjectController');
});
当然我已正确创建了Project模型和控制器,但调用index和create actions总是会返回403禁止响应 . 问题出在哪儿?
Update:
从路由中间件中删除一个操作,结果正确响应 . 像这样的东西:
Route::group(['middleware' => ['can:index,App\Project']], function () {
Route::resource('projects', 'ProjectController');
});
1 回答
通过文档查看
can
中间件并不真正适用于资源 . 您可以在组上使用多个中间件调用,但这意味着您的使用将需要所有权限来访问路由 .您的替代方案是:
将
$this->authorize(new App\Project)
添加到控制器中的index
和create
方法 . Laravel将使用反射来根据调用它的方法确定要使用的策略 .要么
在控制器的
__construct()
方法中,您可以使用:这将要求您在Policy类中创建
update
,view
和delete
方法 . 这些方法中的每一个都将被传递User $user, Project $project
,例如仅供参考,如果您使用
authorize()
取消方法名称或使用authorizeResource()
Laravel会将某些方法名称映射到不同的策略方法,即:您可以通过向控制器添加
resourceAbilityMap()
方法并将其他数组返回到上面的数组来覆盖它 .希望这可以帮助!