Laravel-对同时属于某个对象的用户和对象的策略授权
我想授权我的Laravel应用程序的API。 我现在的结构是这样的: 用户属于一个组织,该组织有许多(比方说)对象。 现在,我希望只有用户可以查看/编辑/创建/删除属于他们所属组织的对象 我查看对象的API路径是:Laravel-对同时属于某个对象的用户和对象的策略授权,laravel,authorization,laravel-passport,Laravel,Authorization,Laravel Passport,我想授权我的Laravel应用程序的API。 我现在的结构是这样的: 用户属于一个组织,该组织有许多(比方说)对象。 现在,我希望只有用户可以查看/编辑/创建/删除属于他们所属组织的对象 我查看对象的API路径是: Route::get('organizations/{id}/objects','ObjectController@indexOrganization')->middleware('auth:api'); 我创建了用户、组织和对象的模型。他们都有自己的控制器 我创建了Obje
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)
functionObjectController
。我如何将其映射到OrganizationPolicy
,以便只有属于该组织的人员才能查看该组织的单个对象?您帮了我这么多!谢谢!!谢谢您的回答-我将尽快尝试,并将其标记为正确:-)!!我不知道我做错了什么!!还是403。查看我的编辑:-(我发现了我的问题!!必须将App\Organization::class=>App\Policies\OrganizationPolicy::class,
更改为'App\Organization'=>'App\Policies\OrganizationPolicy'
——还有一个问题:是否可以将完整资源“映射”为::get,::post,…?是的,您可以使用authorizationResource()
并覆盖控制器中的resourceAbilityMap()
方法。请参见我的另一个答案:在我的示例中会是怎样的。假设我想用路由显示单个对象:…api/objects/1
。因此它执行显示($id)
functionObjectController
。如何将其映射到OrganizationPolicy
,以便只有属于该组织的人员才能查看该组织的单个对象?您帮了我很多忙!谢谢!!