Php 用于检查资源是否为用户所有的中间件

Php 用于检查资源是否为用户所有的中间件,php,laravel,laravel-5,Php,Laravel,Laravel 5,我在制作检查用户是否拥有被请求的资源的中间件时遇到了一些问题 例如,如果用户转到/playlists/1/编辑,但他们不拥有playlist 1,则应显示401错误 以下是我目前掌握的情况: class CheckOwnership { public function handle(Request $request, Closure $next) { if (Playlist::find($request->route()->parameters()

我在制作检查用户是否拥有被请求的资源的中间件时遇到了一些问题

例如,如果用户转到
/playlists/1/编辑
,但他们不拥有playlist 1,则应显示401错误

以下是我目前掌握的情况:

class CheckOwnership {

    public function handle(Request $request, Closure $next)
    {
        if (Playlist::find($request->route()->parameters()['playlists'])->user_id !== $request->user()->id)
        {
            return response('Unauthorized.', 401);
        }

        return $next($request);
    }

}
这是可怕的,只适用于播放列表资源,但我找不到任何更好的方法来做到这一点


感谢当前,Laravel 5不支持向中间件传递参数。我改用会话

在播放列表控制器上,获取播放列表的所有者并将其存储在会话中。假设您有一个包含userID和playlid列的playlists表

public function __construct($playlistID){
    $owner = Playlist::where('playlistID',$playlistID)->pluck('userID');
    Session::put('OWNER',$owner);
    $this->middleware('CheckOwnership',['only'=>'edit']); // apply it to edit function only, assuming you are using a route resource
}
然后,只需在中间件句柄函数中检索它

public function handle(Request $request, Closure $next)
{
    if (Session::get('OWNER') != $request->user()->id)
    {
        return response('Unauthorized.', 401);
    }

    return $next($request);
}

到目前为止,这是一个简单的解决方法。我们必须等到奥特韦尔考虑像中间产品一样的过滤器。希望这有帮助

这可以通过新添加的表单请求验证轻松实现

您可以在此处查看详细信息(授权表单请求):

给出的示例实际上是关于一个用户试图编辑自己的评论

摘录:

表单请求类还包含一个authorize方法。在此范围内 方法,您可以检查经过身份验证的用户是否实际拥有 更新给定资源的权限。例如,如果用户是 试图更新博客帖子评论,他们真的拥有吗 评论


在您的情况下,如果他们不拥有播放列表,只需从authorize方法返回false即可

我以为这些只是为了验证表格?它们可以用于GET请求吗?它们仍然可以用于GET请求,因为表单可以提交到GET路径。