我有一个名为Post
的资源。每个Post
都与一个User
相关,而一个User
可能有多个(或零个)Posts
。
我正在使用Route::resource
将针对Post
资源的每个可能动作的路由映射到单个资源控制器PostController
。
现在,我希望为Post
资源实施一项政策。为了使所有内容尽可能简单和简单,我希望制定以下政策:
Post
的任何操作(例如,创建)。User
仅被授予访问Posts
的每个操作(例如,编辑,更新,删除)访问自己的Post
的权限。我现在想做的是创建一个名为access
的单一策略方法,该方法将检查Post
是否由User
拥有。然后,在我的PostController
中,每个参数中带有Post
对象的方法(例如edit(Post $post)
)都将以
$this->authorize('access', $post);
但是,我不喜欢我需要手动放置这些行。如果我忘记了其中一个,那我马上就会有一个安全漏洞。
另一方面,我有一个authorizeResource
方法,该方法使授权自动进行,但要求策略具有多个方法,因此它们被映射到控制器的每个方法。另外,我尝试使用Authorize
/can
middleware,但没有用(也许是因为我在Route::resource
映射上使用了它。)
问题是:实现我所描述的结果(即授权使用完全相同的规则访问资源的所有可能操作)的最干净,更安全的方法是什么?
答案 0 :(得分:2)
您可以使用authorizeResource()
并在控制器中覆盖resourceAbilityMap()
方法。后一种方法返回从控制器方法到将要调用的策略方法的映射。
例如
class MyController extends Controller
{
// ...
/**
* Get the map of resource methods to ability names.
*
* @return array
*/
protected function resourceAbilityMap()
{
return [
'edit' => 'access',
'update' => 'access',
'destroy' => 'access',
];
}
// ...
}