首页 文章

通过中间件进行Laravel授权

提问于
浏览
3

我使用以下两个操作在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 回答

  • 3

    通过文档查看 can 中间件并不真正适用于资源 . 您可以在组上使用多个中间件调用,但这意味着您的使用将需要所有权限来访问路由 .

    您的替代方案是:

    $this->authorize(new App\Project) 添加到控制器中的 indexcreate 方法 . Laravel将使用反射来根据调用它的方法确定要使用的策略 .

    要么

    在控制器的 __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',
    ];
    

    您可以通过向控制器添加 resourceAbilityMap() 方法并将其他数组返回到上面的数组来覆盖它 .

    希望这可以帮助!

相关问题