【问题标题】:Laravel 5 - Only Owner (creator) can edit/delete/view EntryLaravel 5 - 只有所有者(创建者)可以编辑/删除/查看条目
【发布时间】:2015-05-23 04:29:52
【问题描述】:

我是Laravel 的新手,有一个小问题。

我想实现只有帖子的创建者/所有者才能编辑/查看/删除它。

每个帖子属于一个用户,每个用户可以有多个帖子(一对多关系)。这部分就像一个魅力。

更具体地说,如果调用这些路由之一:

GET mydomain.com/posts/{id} (show)

GET mydomain.com/posts/{id}/edit (edit)

PUT mydomain.com/posts/{id} (update)

DELETE mydomain.com/posts/{id} (destroy)

应用程序应检查当前已通过身份验证的用户的 id 是否与帖子 user_id 字段匹配。

据我所知,这对于中间件是不可能的,因为中间件无法访问当前的 Post-Object,我无法将参数传递给它。

目前我能够通过过滤器实现我的目标(我使用 Route-Model 绑定)。

Route::filter('isOwnerOfPost', function() {
 if(Route::input('posts')->user_id !==  \Auth::id()) {
    abort(403);
 };
});

Route::get('posts', 'PostController@index');
Route::group(['before' => 'isOwnerOfPost'], function(){
 Route::resource('posts', 'PostController', ['except' => ['index', 'create', 'store']]);
});

但这个解决方案对我来说似乎有点混乱。我必须为每个模型创建一个新过滤器,并且我不能使用资源丰富的路由(至少不是完全)。

有没有更好的方法来完成这样的行为?

【问题讨论】:

  • 绝对应该检查this answer。它拥有完整的相关中间件开发和解释。

标签: php authentication filter laravel-5 middleware


【解决方案1】:

我能够用中间件解决它。以下代码仅在参数的路由模型绑定为“活动”时才有效。

我真的不知道这是否是正确的方法,但它似乎工作......

public function handle($request, Closure $next)
{
    $requestParameters = $request->route()->parameters();

    foreach ($requestParameters as $requestParameter) {
        // Loop through route parameters
        if (gettype($requestParameter) === "object") {
            // Route Model Binding is active for this parameter
            if (isset($requestParameter->user_id)) {
                // Model has an owner (column user_id is set)
                $owner = $requestParameter->user_id;

                if ($owner !== Auth::id()) {
                    // Authenticated user is the not owner
                    abort(403);
                }
            }
        }
    }

    return $next($request);
}

【讨论】:

    【解决方案2】:

    根据官方文档(https://laravel.com/docs/5.3/authorization),您应该为此使用Gate 或内置can 中间件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2020-05-02
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多