我想创建一个应用程序,其中将有几个教学 html 和 css 的视频,因此任何用户都可以观看任何经过身份验证的视频。
对于每个用户,这些视频的 url 应该与用户会话相关联,防止用户将视频 url 发送给其他人以(免费)访问。
当用户注销该possible copy
文件时,该文件将与用户的会话一起被删除。
- 当老师上传视频时,视频将与存储系统一起保存。
- 创建文件的副本或在数据库中建立关联?
- 我对如何处理这些文件的想法是正确的?
关于如何做到这一点的任何想法?
我想创建一个应用程序,其中将有几个教学 html 和 css 的视频,因此任何用户都可以观看任何经过身份验证的视频。
对于每个用户,这些视频的 url 应该与用户会话相关联,防止用户将视频 url 发送给其他人以(免费)访问。
当用户注销该possible copy
文件时,该文件将与用户的会话一起被删除。
关于如何做到这一点的任何想法?
更好的方法是使用中间件。创建一个表来存储哪些用户可以访问哪些视频。中间件可以检查登录的用户是否可以访问请求的视频。如果没有abort(403)
。
所有用户的 URL 都是相同的,/videos/{video_id}
但由于中间件,只有被授予访问权限的用户才能观看视频
我会把你的问题分成两部分
上传内容和用户之间的第一个
“多对多”关系
users -> video_user <- videos
$user->allowedVideos()
&$video->allowedUsers()
其次
,您的视频内容应该可以通过安全途径访问
{base_url}/video/{video_id}
正如@jithin 建议的那样,我们可以使用 amiddleware
来授权用户登录会话并检查用户是否可以访问视频。否则返回 403。
-- 答案已更新
假设您必须对文件实施访问限制。因此,正如@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。
假设视频是嵌入的,但您也不希望从源中提取视频链接,我建议您采用基本方法。
如果所有用户都可以访问所有视频,那么在数据库中维护映射是一个坏主意。那会变得很大,很快。这也是不必要的。
您可以在路线的末尾添加部分,让我们说:
$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();
}
第二个选项有点过于复杂,但它可能“看起来好一点”。无论哪种方式都比使用数据库简单一百倍。