Laravel - 对属于某物的用户和对象的策略授权

Laravel - Policy authorization on user and object that both belong to something

我想授权我的 Laravel 应用程序的 API。 我现在的结构是这样的:

用户属于一个组织,该组织有很多(比方说)对象。 现在我希望只有用户可以 view/edit/create/delete 属于他们所属组织的对象。

我的 API 查看对象的路线是:

Route::get('organizations/{id}/objects','ObjectController@indexOrganization')->middleware('auth:api');

我创建了模型用户、组织和对象。他们都有自己的控制器。

我创建了 ObjectPolicy 并尝试了这个:

public function view(User $user, Object $object)
    {
      return $user->organization_id === $object->organization_id;
    }

然后我在路线中添加了->middleware('can:view,object');。 不幸的是,它不起作用,Laravel 文档没有提供我需要的信息。

有人可以帮忙吗? 谢谢!

编辑

我不知道我做错了什么!!我更改了所有内容,但仍然收到 403 响应。

这是我的代码:

路线:

Route::get('organizations/{organization}/objects','ObjectController@index Organization')->middleware('auth:api', 'can:view, organization');

组织政策:

public function view(User $user, Organization $organization)
{
    return $user->organization_id === $organization->id;
}

对象控制器:

public function indexOrganization(Organization $organization)
{
  $objects = $organization->objects;
  return ObjectResource::collection($objects);
}

我也把这个添加到我的 AuthServiceProvider:

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    App\Organization::class => App\Policies\OrganizationPolicy::class,
];

编辑 2 / 解决方案

newUserName02 的答案有效!问题出在 AuthServiceProvider 内部。在我将代码更改为(见上文编辑)后:

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\Organization' => 'App\Policies\OrganizationPolicy',
];

成功了!

策略方法应该与您传递给控制器​​的参数相匹配。看起来您正在路由中传递 Organization 的 ID,但您正在尝试检查策略中的 Object

https://laravel.com/docs/5.7/authorization#via-middleware

您可以利用 Laravel 的隐式模型绑定将组织注入控制器,如下所示:

路线:

Route::get('organizations/{organization}/objects','ObjectController@indexOrganization')->middleware('auth:api', 'can:view,organization');

政策:

public function view(User $user, Organization $organization)
{
  return $user->organization_id === $organization->id;
}

控制器:

public function indexOrganization(Organization $organization)
{
    ...
}

注意路由中的 {organization}->middleware() 调用中的 organization 匹配,后者与策略和控制器中的 $organization 匹配。