【问题标题】:Laravel authorization via middlewareLaravel 通过中间件授权
【发布时间】:2017-03-15 02:26:08
【问题描述】:

我在 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');
});

当然我已经正确地创建了项目模型和控制器,但是调用索引和创建操作总是返回 403 禁止响应。问题出在哪里?

更新:

从路由中间件中删除其中一项操作会产生正确的响应。像这样:

Route::group(['middleware' => ['can:index,App\Project']], function () {
    Route::resource('projects', 'ProjectController');
});

【问题讨论】:

  • 您是否尝试使用剩余操作创建第二个 Route::group 块。那将是 ...can:create,App\Project...?
  • 是的,但第二组将取决于第一个中间件的结果,如果第一个中间件返回错误的中断...
  • 也许这会有所帮助。很抱歉,我不知道答案。刚刚谷歌了一下这个问题:stackoverflow.com/questions/38580890/…祝你好运!

标签: php laravel laravel-5


【解决方案1】:

查看文档,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() 方法并将不同的数组返回到上面的数组来覆盖它。

希望这会有所帮助!

【讨论】:

  • 谢谢。我不确定为什么没有记录 AuthorizesRequests::authorizeResource 方法。当然应该!
  • @hackel 文档中缺少很多东西。您可以随时在 github 存储库中创建问题,甚至自己编写它们,然后创建拉取请求 :)
【解决方案2】:

花几个小时在那... 如果您的控制器方法不采用模型作为参数,您还必须覆盖 resourceMethodsWithoutModels()

protected function resourceAbilityMap()
{
    Log::info("Inside resourceAbilityMap()");
    return array_merge(parent::resourceAbilityMap(), [
        //ControllerMethod => PolicyMethod
        'index' => 'index',
        'search' => 'search'
    ]);
}


protected function resourceMethodsWithoutModels(){
    return array_merge(parent::resourceMethodsWithoutModels(), [
        'search'
    ]);
}

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2016-11-27
    • 2021-10-15
    • 2020-01-05
    相关资源
    最近更新 更多