将s3文件限制为Django组用户

时间:2014-10-02 15:07:48

标签: python django amazon-web-services amazon-s3 django-storage

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

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

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

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

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

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

根据我的aws密钥有自动解决方案吗? 我迷失了......

2 个答案:

答案 0 :(得分:2)

编辑新解决方案:

Amazon SDK提供预签名网址功能。 有了这个,您只能为您的用户生成一个特定文件的临时网址。

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

最终用户可以直接从亚马逊加载和查看浏览器中的文件,就像没有发生任何事情一样。

旧解决方案

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

简单的例子。

S3文件路径

// media / group1 / folder1 / 1.png

Request = MyWebMethod / GetFile?internalPath =" folder1 / 1.png"

{

Int userId = customAuthentication.getUserId();

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

var image = AwdSdkClient.getFileFromS3(CompletePath);

返回图片;

}

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

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

答案 1 :(得分:0)

您希望为经过身份验证的用户有效地提供单点登录。一种方法,也许是解决这个问题的唯一方法,就是使用SAML provider。这样做,您就可以将第三方经过身份验证的用户/群组映射到AWS IAM个用户/群组。

它会起作用,但只需点击几下鼠标就可以了。