Laravel 使用单个策略方法覆盖资源上的每个操作

Laravel 使用单个策略方法覆盖资源上的每个操作,laravel,authorization,Laravel,Authorization,我有一个名为Post的资源。每个帖子都与单个用户相关,一个用户可能有多篇(或零篇)帖子 我正在使用Route::resource将Post资源上每个可能操作的路由映射到单个资源控制器PostController 现在,我希望为Post资源实现一个策略。为了使一切尽可能简单和简单,我想制定如下政策: 每个用户都有权执行任何不需要现有Post(例如创建)的操作 用户仅被授权访问其自己的帖子,用于访问帖子(例如编辑、更新、删除)的每个操作 我现在要做的是创建一个名为access的策略方法,它将检查

我有一个名为
Post
的资源。每个
帖子
都与单个
用户
相关,一个
用户
可能有多篇(或零篇)
帖子

我正在使用
Route::resource
Post
资源上每个可能操作的路由映射到单个资源控制器
PostController

现在,我希望为
Post
资源实现一个策略。为了使一切尽可能简单和简单,我想制定如下政策:

  • 每个用户都有权执行任何不需要现有
    Post
    (例如创建)的操作
  • 用户
    仅被授权访问其自己的
    帖子
    ,用于访问
    帖子
    (例如编辑、更新、删除)的每个操作
我现在要做的是创建一个名为
access
的策略方法,它将检查
Post
是否由
用户拥有。然后,在我的
PostController
中,每个参数中包含
Post
对象的方法(例如
edit(Post$Post)
)都将以

$this->authorize('access',$post)

但是,我不喜欢这样,我需要手动放置这些行。如果我忘了其中一个,我会在那里有一个安全漏洞

另一方面,我有
authorizeResource
方法,它使授权自动进行,但要求策略具有多个方法,以便将它们映射到控制器的每个方法。另外,我尝试使用,但没有成功(可能是因为我在
Route::resource
映射中使用了它)


问题是:实现我所描述的结果(即授权使用完全相同规则访问资源的所有可能操作)的最干净、更安全的方法是什么?

您可以使用
authorizeResource()
并覆盖控制器中的
resourceAbilityMap()
方法。后一种方法返回从控制器方法到将被调用的策略方法的映射

例如


您可以使用
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',
        ];
    }

    // ...
}