限制S3文件对Django组用户的访问

3
我的Web应用程序使用Amazon S3来存储所有媒体文件,借助于django-storages第三方应用程序,在我的Django Web应用程序中处理文件夹和文件层次结构,并且每个用户只能看到属于他组的链接。
但是!在S3上没有其他文件夹的许可。
例如: 用户1:组为group1 用户2:组为group2 s3链接:https://s3.amazonaws.com//media/group1/folder1/1.png
用户1将在应用程序内的自己的页面上看到此链接。 用户2将无法看到此链接,但是如果他试图访问此链接,则该文件没有权限,因此可以轻松下载。
我的目标是限制每个组的文件夹权限。
是否有基于我的AWS密钥的自动解决方案? 我迷失了...
2个回答

6

编辑新解决方案:

亚马逊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);

return image;

}

因此,默认情况下,每个用户只能请求自己组内的文件。

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


0
您正在寻求为您的Web认证用户有效地提供单点登录。 一种处理此问题的方式,也许是唯一的方式,是通过使用SAML提供程序。 这样做,您将把第三方认证的用户/组映射到AWS IAM用户/组。
它会起作用,但需要比几个鼠标点击更多的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接