Laravel - 根据用户会话提供文件

时间:2018-03-06 00:30:18

标签: laravel laravel-5 laravel-5.6

我想创建一个应用程序,其中有几个视频教授html和css,因此任何用户都可以观看任何视频,如果经过身份验证。

对于每个用户,这些视频的网址应与用户会话相关联,从而阻止用户将视频网址发送给他人(免费)访问。

当用户的会话删除文件possible copy的用户日志时。

  1. 当教师上传视频时,视频将随之保存 存储系统。
  2. 创建文件的副本或在数据库中建立关联?
  3. 我对如何处理这些文件的想法是正确的吗?
  4. 如何做到这一点?

4 个答案:

答案 0 :(得分:0)

更好的方法是使用middleware。创建一个表,用于存储哪些用户可以访问哪些视频。中间件可以检查登录的用户是否可以访问所请求的视频。如果不是abort(403)

所有用户的网址都相同,例如/videos/{video_id},但只有获得访问权限的用户才能观看视频,因为中间件

答案 1 :(得分:0)

我会将你的问题分成两部分

  • 将视频内容分配给经过身份验证的用户
  • 阻止所有经过身份验证的用户共享当前会话之外的内容

<强>第一
&#39;许多一对多&#39;上传内容与用户之间的关系
users -> video_user <- videos
$user->allowedVideos()&amp; $video->allowedUsers()

<强>第二
您的视频内容应该可以通过安全路线访问

{base_url}/video/{video_id}

正如@jithin建议的那样,我们可以使用middleware授权用户登录会话并检查用户是否可以访问该视频。否则返回403。

- 答案已更新

答案 2 :(得分:0)

假设您必须实施文件的访问限制。因此,正如@Farooq Khan所建议的那样,实现一个数据透视表来保存用户文件映射,以查找谁有权访问这些文件。

下一步将验证文件网址。所有用户的文件网址都相同,例如/admin/download/{fileName}。请不要该文件实际上不存在于/admin/download/目录中,因此请求将被Web服务器重定向到laravel。

Route::get('/admin/download/{file_name}', ['as' => 'admin.download', function($fileName) 
{
    return Response::download($file_name);
}])->before('file_auth');

现在你必须创建file_auth中间件,你必须检查用户(Auth::user()->id)是否有权访问文件名($request->route('fileName'))。如果用户没有权限回复403。

答案 3 :(得分:0)

假设视频已嵌入,但您也不希望从源中提取视频链接,我建议您采用基本方法。

如果所有用户都可以访问所有视频,那么在数据库中维护映射是一个坏主意。那会很快,很快。这也没必要。

您可以在路线的末尾添加部分,让我们说出类似的内容;

$router->get('/watch/{videoId}/{userId}', [....]);

然后就像;

$router->get('/video/{videoId}/{userId}, [....]);

第一个是您观看视频的页面的路线,第二个是用于嵌入视频的动态链接。您现在需要做的就是添加一些类似于以下内容的中间件;

if ($router->param('userId') !== auth()->id()) {
    throw new NotFoundHttpException();
}

另外,您可以执行上述操作,但路线将{videoId}/{videoHash}而不是{videoId}/{userId}。视频哈希就像下面这样;

$videoHash = crc32($video->id . ';' . auth()->id);

然后,你只需要像上面这样的中间件,但是,它会执行以下操作;

$hash = crc32($router->param('videoId') . ';' . auth()->id());
if ($router->param('videoHash') !== $hash) {
    throw new NotFoundHttpException();
}

第二个选项有点过于复杂,但它可能“看起来好一点”。无论哪种方式都比使用数据库简单了一百倍。