2014-10-02 36 views
1

我的web应用程序使用Amazon S3将所有媒体文件存储在我的djagno web应用程序中,并通过django-storages第三方应用程序的帮助。将s3文件限制为Django组用户

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

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

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

用户1会看到这个在他的内页应用程序。 用户2不会看到这个链接,但是如果他试图访问这个链接,那么这个文件就没有权限,并且它很容易下载。

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

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

回答

1

编辑新的解决方案:

亚马逊SDK提供了预签名URL特性。 使用此功能,您只能为用户生成一个特定文件的临时网址。

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

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

老办法

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

简单的例子。

S3文件路径

//media/group1/folder1/1.png

请求= MyWebMethod /的GetFile?internalPath =“文件夹1/1。PNG”

{

诠释用户id = customAuthentication.getUserId();

字符串CompletePath = “媒体/组” +用户id + “/” + internalPath

变种图像= AwdSdkClient.getFileFromS3( CompletePath);

返回的图像;

}

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

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

0

您正在寻找为您的网络认证用户有效提供单点登录。一种方式,或许是解决这个问题的唯一方法,就是通过使用SAML provider。这样做,您会将您的第三方认证用户/组映射到AWS IAM用户/组。

它会工作,但它需要的不仅仅是点击几下鼠标。