我使用以下两个操作在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模型和 Controller ,但是调用索引和创建 Action 总是返回403禁止响应。问题出在哪儿?

更新:

从路由中间件中删除一项操作,将得到正确的响应。像这样的东西:
Route::group(['middleware' => ['can:index,App\Project']], function () {
    Route::resource('projects', 'ProjectController');
});

最佳答案

仔细阅读文档,can中间件并不会真正将其借给资源。您可以在组上使用多个中间件调用,但这意味着您的使用将需要所有特权才能访问路由。

您的替代方法是:

$this->authorize(new App\Project)添加到 Controller 中的indexcreate方法中。 Laravel将根据其调用的方法使用反射来找出要使用的策略。

或者

在 Controller 的__construct()方法中,您可以使用:

$this->authorizeResource(App\Project::class);

这将需要您
在Policy类中创建updateviewdelete方法。这些方法中的每一个都将通过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/

10-16 04:09