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

时间:2018-10-26 17:04:26

标签: laravel authorization policy laravel-passport

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

用户属于组织,该组织具有许多(可以说)对象。 现在,我希望只有用户才能查看/编辑/创建/删除属于他们所属组织的对象。

我查看对象的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');

OrganizationPolicy:

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

ObjectController:

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',
];

成功了!

1 个答案:

答案 0 :(得分:2)

policy方法应与您要传递给控制器​​的参数匹配。看来您正在路由中传递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}organization调用中的->middleware()匹配,并且与策略和控制器中的$organization匹配。