Php Laravel 5-只有所有者(创建者)可以编辑/删除/查看条目

Php Laravel 5-只有所有者(创建者)可以编辑/删除/查看条目,php,authentication,filter,laravel-5,middleware,Php,Authentication,Filter,Laravel 5,Middleware,我是拉威尔的新手,有一个小问题 我想做到的是,只有文章的创建者/所有者可以编辑/查看/删除它 每个帖子属于一个用户,每个用户可以有多篇帖子(一对多关系)。那部分很有魅力 更具体地说,如果调用其中一条路线: GET mydomain.com/posts/{id} (show) GET mydomain.com/posts/{id}/edit (edit) PUT mydomain.com/posts/{id} (update) DELETE mydomain.com/posts/{id} (

我是拉威尔的新手,有一个小问题

我想做到的是,只有文章的创建者/所有者可以编辑/查看/删除它

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

更具体地说,如果调用其中一条路线:

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是否与posts user_id字段匹配

据我所知,这在中间件中是不可能的,因为中间件没有访问当前Post对象的权限,并且我无法向其传递参数

目前,我能够通过过滤器实现我的目标(我使用路由模型绑定)

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


有没有更好的方法来实现这样的行为?

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

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

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);
}

您应该使用
Gate
或内置的
can
中间件,根据官方文件()

您应该明确检查。它开发了整个相关的中间件,并对其进行了精彩的解释。
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);
}