我想创建一个应用程序,其中有几个视频教授html和css,因此任何用户都可以观看任何视频,如果经过身份验证。
对于每个用户,这些视频的网址应与用户会话相关联,从而阻止用户将视频网址发送给他人(免费)访问。
当用户的会话删除文件possible copy
的用户日志时。
如何做到这一点?
答案 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();
}
第二个选项有点过于复杂,但它可能“看起来好一点”。无论哪种方式都比使用数据库简单了一百倍。