我想授权我的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',
];
成功了!
答案 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
匹配。