1

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

对于每个用户,这些视频的 url 应该与用户会话相关联,防止用户将视频 url 发送给其他人以(免费)访问。

当用户注销该possible copy文件时,该文件将与用户的会话一起被删除。

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

关于如何做到这一点的任何想法?

4

4 回答 4

0

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

所有用户的 URL 都是相同的,/videos/{video_id}但由于中间件,只有被授予访问权限的用户才能观看视频

于 2018-03-11T09:45:22.053 回答
0

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

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

上传内容和用户之间的第一个
“多对多”关系
users -> video_user <- videos
$user->allowedVideos()&$video->allowedUsers()

其次
,您的视频内容应该可以通过安全途径访问

{base_url}/video/{video_id}

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

-- 答案已更新

于 2018-03-11T14:05:34.067 回答
0

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

下一步将是验证文件 url。所有用户的文件 url 都是相同的,一个例子是/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。

于 2018-03-11T14:52:23.000 回答
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();
}

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

于 2018-03-11T17:35:06.233 回答