【问题标题】:Using a single policy method to cover every action on a resource使用单一策略方法覆盖对资源的每个操作
【发布时间】:2019-03-16 20:55:28
【问题描述】:

我有一个名为 Post 的资源。每个Post 都与一个User 相关,一个User 可能有多个(或零个)Posts

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

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

  • 每个用户都有权执行任何不需要现有 Post 的操作(例如创建)。
  • 对于访问 Post 的每个操作(例如编辑、更新、删除),User 仅被授权访问其自己的 Posts

我现在要做的是创建一个名为access 的单一策略方法,它将检查Post 是否由User 拥有。然后,在我的PostController 中,每个参数中包含Post 对象的方法(例如edit(Post $post))都将以

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

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

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

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

【问题讨论】:

    标签: laravel authorization


    【解决方案1】:

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

    https://github.com/laravel/framework/blob/5.7/src/Illuminate/Foundation/Auth/Access/AuthorizesRequests.php#L105

    例如

    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',
            ];
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2011-06-19
      相关资源
      最近更新 更多