【问题标题】:what is the most elegant way to restrict users from accessing other users' content?限制用户访问其他用户内容的最优雅的方法是什么?
【发布时间】:2017-05-08 08:26:54
【问题描述】:

我必须建立一个项目,用户将在其中登录并上传一些图像和视频,并且上传的文件应该只有上传者或网站管理员才能看到。

我主要是 Node.js,所以我尝试使用 express 中间件来限制用户的媒体文件,但我注意到这不是处理这个问题的最佳方法,因为 express 不擅长呈现静态内容。

以下是一些谷歌会话后我能想到的选项

  • Amazon S3 存储桶,每个用户都可以在其中获得自己的文件夹/权限和文件(但当我们有 url 时文件是真正私有的)
  • 使用来自 S3 存储桶的预签名 URL 生成文件的临时 URL(该文件将公开 20 分钟,我不希望这样)
  • 限制对 Nginx 的访问(我也不知道 Nginx 是否可以访问数据库并验证它收到的请求)
  • 在 mongoDB 中使用 GridFS? (我可能不会使用这个,但想看看这是否可以解决)

还有其他方法可以做到这一点吗?

【问题讨论】:

  • 如果您的内容取决于谁登录,则它不是静态的。最简单的方法是编写您自己的代码来检查权限,然后从磁盘加载文件。用 node.js 或任何其他语言编写自己的文件加载代码并没有错。 当它成为问题时,您才应该担心性能。

标签: node.js amazon-web-services nginx amazon-s3 private


【解决方案1】:

最优雅的方式是礼貌地要求他们不要访问其他人的内容。

不过,我不确定这是否是最有效的方法。

不过,说真的,我建议使用express.static 中间件和Passport 或其他东西来实现身份验证和权限。您不是在这里“渲染”任何静态内容。您只是直接从磁盘流式传输文件。

【讨论】:

  • 即使用户有几千人,express.static 也能管理负载吗? (不是同时)
  • @syedfaizan 我不明白为什么不能。请参阅this answer,在那里我使用http-server 进行了一些测试,我得到了 10000 个 同时 连接,没有任何问题。我认为express.static 在这里不会有什么不同。
【解决方案2】:

每个用户都有一个唯一的 ID,其中内容(文件和视频等)部分由该 ID 引用,因此客户只能访问他们的 ID 内容

用户登录,nodejs 将该用户与从 mongodb 检索到的唯一 ID 配对。无需将其卸载到 nginx。存放内容的位置与此逻辑无关。可能是本地文件系统、mongo、S3 等...

避免将用户名或 ID 放入任何 URL,其冗余的服务器在内部维护这些知识。无需混淆 URL。例如,当我与我的私人内容交互时,Amazon AWS 有这个 URL

https://console.aws.amazon.com/route53/home?#resource-record-sets:ZAHKXPA7IKZ8W

看到它只显示我的用户名资源唯一的内容 ID。目标是尽量减少 URL 中的混乱。

或者,在共享资源的世界中​​,比如在闪烁时,这里的 URL 确实提供了用户名和资源 ID https://www.flickr.com/photos/okinawa-soba/31419099190/in/photostream/ 在你的情况下,即使有人拿起另一个内容的 URL,服务器也必须拒绝,因为它没有被授权和别人的内容混在一起

【讨论】:

  • 也可以...如果 url 看起来像 /:username/:filename 并且我配置了 GET 路由并添加一个中间件检查会话以及路由中的用户名(与会话相同) .那也应该可以正常工作吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2021-10-22
  • 2010-11-05
  • 2015-08-13
  • 1970-01-01
相关资源
最近更新 更多