Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel-对同时属于某个对象的用户和对象的策略授权_Laravel_Authorization_Laravel Passport - Fatal编程技术网

Laravel-对同时属于某个对象的用户和对象的策略授权

Laravel-对同时属于某个对象的用户和对象的策略授权,laravel,authorization,laravel-passport,Laravel,Authorization,Laravel Passport,我想授权我的Laravel应用程序的API。 我现在的结构是这样的: 用户属于一个组织,该组织有许多(比方说)对象。 现在,我希望只有用户可以查看/编辑/创建/删除属于他们所属组织的对象 我查看对象的API路径是: Route::get('organizations/{id}/objects','ObjectController@indexOrganization')->middleware('auth:api'); 我创建了用户、组织和对象的模型。他们都有自己的控制器 我创建了Obje

我想授权我的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;
    }
然后我添加了
->中间件('can:view,object')到路线。
不幸的是,它不起作用,Laravel文档也没有提供我需要的信息

有人能帮忙吗? 谢谢

编辑

我不知道我做错了什么!!我改变了一切,但仍然得到403的回复

这是我的密码:

路线:

Route::get('organizations/{organization}/objects','ObjectController@index Organization')->middleware('auth:api', 'can:view, organization');
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)
{
  $objects = $organization->objects;
  return ObjectResource::collection($objects);
}
public function indexOrganization(Organization $organization)
{
    ...
}
我还将此添加到我的
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',
];

成功了

策略方法应该与传递给控制器的参数相匹配。看起来您正在传递路由中组织的id,但您正在尝试检查策略上的对象

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

路线:

Route::get('organizations/{organization}/objects','ObjectController@index Organization')->middleware('auth:api', 'can:view, organization');
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)
{
  $objects = $organization->objects;
  return ObjectResource::collection($objects);
}
public function indexOrganization(Organization $organization)
{
    ...
}

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

策略方法应与传递给控制器的参数匹配。看起来您正在传递路由中组织的id,但您正在尝试检查策略上的对象

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

路线:

Route::get('organizations/{organization}/objects','ObjectController@index Organization')->middleware('auth:api', 'can:view, organization');
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)
{
  $objects = $organization->objects;
  return ObjectResource::collection($objects);
}
public function indexOrganization(Organization $organization)
{
    ...
}

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

路由中的
{id}
是组织还是对象?您可以发布
ObjectController@indexOrganization
?id代表组织。。我想把它所有的东西都拿来。。。我在后面发布代码组织或对象的路由中是
{id}
?您可以发布
ObjectController@indexOrganization
?id代表组织。。我想把它所有的东西都拿来。。。我稍后发布代码谢谢你的回答-我会尽快尝试并标记为正确,如果有效:-)!!我不知道我做错了什么!!还是403。查看我的编辑:-(我发现了我的问题!!必须将
App\Organization::class=>App\Policies\OrganizationPolicy::class,
更改为
'App\Organization'=>'App\Policies\OrganizationPolicy'
——还有一个问题:是否可以将完整资源“映射”为::get,::post,…?是的,您可以使用
authorizationResource()
并覆盖控制器中的
resourceAbilityMap()
方法。请参见我的另一个答案:在我的示例中会是怎样的。假设我想用路由显示单个对象:
…api/objects/1
。因此它执行
显示($id)
function
ObjectController
。我如何将其映射到
OrganizationPolicy
,以便只有属于该组织的人员才能查看该组织的单个对象?您帮了我这么多!谢谢!!谢谢您的回答-我将尽快尝试,并将其标记为正确:-)!!我不知道我做错了什么!!还是403。查看我的编辑:-(我发现了我的问题!!必须将
App\Organization::class=>App\Policies\OrganizationPolicy::class,
更改为
'App\Organization'=>'App\Policies\OrganizationPolicy'
——还有一个问题:是否可以将完整资源“映射”为::get,::post,…?是的,您可以使用
authorizationResource()
并覆盖控制器中的
resourceAbilityMap()
方法。请参见我的另一个答案:在我的示例中会是怎样的。假设我想用路由显示单个对象:
…api/objects/1
。因此它执行
显示($id)
function
ObjectController
。如何将其映射到
OrganizationPolicy
,以便只有属于该组织的人员才能查看该组织的单个对象?您帮了我很多忙!谢谢!!