我的网络应用程序使用Amazon S3在django-storages第三方应用程序的帮助下将所有媒体文件存储在我的djagno网络应用程序中。
我的数据库处理文件夹和文件层次结构,每个用户只看到属于他的组的链接。
但是! S3没有对其他文件夹的权限。
例如: 用户1:组是group1 用户2:组是group2 s3链接:https://s3.amazonaws.com/ / media / group1 / folder1 / 1.png
用户1将在应用内的页面上看到此内容。 用户2不会看到此链接,但如果他尝试访问此链接,则该文件没有权限,可以轻松下载。
我的目标是限制每个群组的文件夹权限。
根据我的aws密钥有自动解决方案吗? 我迷失了......
答案 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个用户/群组。
它会起作用,但只需点击几下鼠标就可以了。