我在 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');
});
当然我已经正确创建了项目模型和 Controller ,但是调用索引和创建操作总是返回 403 forbidden 响应。问题出在哪里?
更新:
从路由中间件中删除其中一个 Action ,得到正确的响应。像这样:
Route::group(['middleware' => ['can:index,App\Project']], function () {
Route::resource('projects', 'ProjectController');
});
最佳答案
查看文档,can
中间件并不真正适用于资源。您可以在该组上使用多个中间件调用,但这意味着您的使用需要所有权限才能访问路由。
您的备选方案是:
将 $this->authorize(new App\Project)
添加到 Controller 中的 index
和 create
方法。 Laravel 将使用反射来根据调用它的方法确定要使用的策略。
或者
在 Controller 的 __construct()
方法中,您可以使用:
$this->authorizeResource(App\Project::class);
这需要你
在您的 Policy 类中创建 update
、view
和 delete
方法。这些方法中的每一个都将传递给 User $user, Project $project
例如
public function view(User $user, Project $project)
{
return true;
}
仅供引用,如果您使用 authorize()
省略方法名称或使用 authorizeResource()
Laravel 会将某些方法名称映射到不同的策略方法,即:
[
//ControllerMethod => PolicyMethod
'show' => 'view',
'create' => 'create',
'store' => 'create',
'edit' => 'update',
'update' => 'update',
'destroy' => 'delete',
];
您可以通过向您的 Controller 添加一个 resourceAbilityMap()
方法并返回一个与上述数组不同的数组来覆盖它。
希望这对您有所帮助!
关于php - Laravel 通过中间件授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40368698/