将 s3 文件限制为 Django 组用户

Tal*_*etz 3 python django amazon-s3 amazon-web-services django-storage

在 django-storages 第三方应用程序的帮助下,我的 Web 应用程序使用 Amazon S3 将所有媒体文件存储在我的 djagno Web 应用程序中。

我的数据库处理文件夹和文件层次结构,每个用户只看到属于他的组的链接。

但!S3 上的其他文件夹没有权限。

例如: 用户 1:组是 group1 用户 2:组是 group2 s3 链接:https: //s3.amazonaws.com/ /media/group1/folder1/1.png

用户 1 将在应用程序内的他的页面上看到此内容。用户 2 将看不到此链接,但如果他尝试访问此链接,则该文件没有权限,并且可以轻松下载。

我的目标是限制每个组的文件夹权限。

有基于我的 aws 密钥的自动解决方案吗?我迷路了...

Ane*_*lou 5

编辑新解决方案:

Amazon SDK 提供预签名 Url 功能。有了这个,您可以仅为您的用户生成一个特定文件的临时 url。

所以用例场景是这样的。S3 图像仍然是私有的。当用户请求他的图像时,您首先将所有链接传递给生成临时链接的签名处理程序。(这些设置为过期并具有大量加密和保护,因此有人不可能劫持这样的链接)。

最终用户可以直接从亚马逊加载和查看他的浏览器中的文件,就像什么也没发生一样。

旧解决方案

好吧,另一种解决方法可能是将所有文件存储在 s3 中而无需公共访问。然后为您的应用程序创建一个 IAM 角色并授予该角色访问存储桶的权限。然后创建一个方法,该方法将读取您的应用程序中的 S3 文件,并在用户拥有权限时将其提供给用户。

简单的例子。

S3 文件路径

//media/group1/folder1/1.png

请求 = MyWebMethod/GetFile?internalPath="folder1/1.png"

{

int userId = customAuthentication.getUserId();

String CompletePath = "media/group"+userId+"/"+internalPath

var image = AwdSdkClient.getFileFromS3(CompletePath);

返回图像;

}

所以默认情况下,每个用户只能在他的组内请求文件。

更高级的方法不是将文件实际提取到您的服务器,而是创建某种到文件的中间数据流管道。(我不是 Django 开发人员,所以我不知道这是否可行)