【问题标题】:how to grant access to an amazon s3 bucket only from within my application?如何仅从我的应用程序中授予对 amazon s3 存储桶的访问权限?
【发布时间】:2012-08-16 18:38:50
【问题描述】:

不确定这是否可行,因为我刚刚开始使用 Amazon S3。

我有一个应用程序,用户可以将图像文件上传到 S3。我希望这些图像文件只能由应用程序用户访问,因此如果用户登录并请求图像,它将显示但是当我尝试通过直接输入图像的 url 来访问图像时,我没有得到图片。

我正在使用 this s3 Coldfusion 处理程序,但我不确定如何正确设置 ACL,因为只有上传用户才能访问存储桶并将 ACL 设置为 public read不会阻止非应用程序用户访问文件。

问题:
是否可以按应用授予 ACL?

【问题讨论】:

  • 您使用的是哪个 CFML 引擎和版本?
  • 仍在运行 Coldfusion 8、MySQL 5.0.88。
  • 我知道这在 CF9+ 上似乎更容易,但我会在一段时间内使用 CF8。
  • 您是否要为您的应用程序的每个用户创建一个存储桶,您不能使用单个存储桶并将每个用户的图像放在一个单独的文件夹中吗?
  • 嗯。现在我正在为每个用户做一个桶(不会那么多)。这比在单个存储桶中为每个用户创建文件夹好还是坏?

标签: authentication coldfusion amazon-s3 download acl


【解决方案1】:

您可以通过传递一个空的 acl 字符串来放置只允许所有者访问的存储桶和对象。所有者我指的是拥有亚马逊帐户,而不是您的应用程序中的用户。

此示例创建一个存储桶,然后将图像上传到子文件夹中。

<cfscript>
s3 = createobject("component", "s3").init(accessKeyId, secretAccessKey);
s3.putBucket("myapps-bucket", "");

s3.putObject(
    bucketName="myapps-bucket", 
    fileKey="image.png", 
    contentType="image/png", 
    acl="",                         
    keyName="user1234/image.png"
);
</cfscript>

要向用户显示图像,您必须生成指向该对象的签名链接,否则他们将从 s3 收到授权错误

<!--- signed link valid for 30 mins --->
<cfset link = s3.getObject(bucket, "user1234/image.png", 30) />
<cfoutput>
    <img src="#link#" />
</cfoutput>

目前每个亚马逊账户只能拥有100 buckets,所以我建议每个用户使用一个文件夹而不是单独的存储桶。

【讨论】:

  • 酷。谢谢(你的)信息。所以“签署”链接的唯一元素是 30(分钟)?开始寻找文件夹信息:-)
  • 是的,getObject() 接受以分钟为单位的有效期。如果图像将立即显示,您可以将其设置为较低。
  • 关于文件夹。这不是 S3 真正的官方,是吗?我只找到上传虚拟文件以创建文件夹的东西。您有指向有效内容的链接吗?
  • 按照我上面的例子,只需在文件名中使用正斜杠 (/)
  • 您将看到文件夹出现在 AWS S3 控制台中,所以是的,它们受到官方支持
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2023-01-12
  • 2017-06-08
相关资源
最近更新 更多