php - Laravel 通过中间件授权

标签 php laravel laravel-5

我在 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 中的 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/

相关文章:

php - Laravel 5.4 fopen() : Filename cannot be empty

php - 在当前日期创建的文件夹和子文件夹中查找文件

php - Laravel Nova 找不到某些模型

php - 如何在 SPhinxql 查询生成器中设置匹配模式

php - 在 Blade 模板中将数字格式设置为 K/M/B

php - 如何使用 laravel 和 gmail 发送电子邮件邀请

一天的 PhP 时间戳

php - OO 及其在 PHP 中的工作原理

php - 在分页中突出显示当前页面?

php - 在 Laravel 5.2 中插入数据后如何重定向到路由?