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
匹配。
我想授权我的 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
匹配。