gpt4 book ai didi

ruby-on-rails-3 - 在 S3 存储桶中设置对象的所有者

转载 作者:行者123 更新时间:2023-12-04 07:14:23 25 4
gpt4 key购买 nike

我一直在试验 S3,他们有这个很酷的功能,您可以通过存储桶策略在存储桶的内容上设置 ACL。因此,例如,您可以将文件上的实际 ACL 设置为私有(private)的一堆文件,但该文件通过覆盖策略对某些用户/IP 地址/引用者可​​用。

就我而言,我在存储桶中有一堆私有(private)内容,但我想让特定目录中的文件对我的站点可用(例如图像)。所以我有这样的事情:

{
"Version": "2008-10-17",
"Id": "",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::content-racket-fm/uploaded/images/*"
}
]
}

现在我们有了一些背景,我可以回答这个问题。我最近在这里发现:

https://forums.aws.amazon.com/thread.jspa?threadID=78294

该存储桶策略仅适用于 的文件。拥有由存储桶所有者。因此,例如,如果文件通过某种外部服务(如 encoding.com 或 panda 流)在存储桶中结束,它们在您的 S3 存储桶上有自己的用户,那么您将遇到问题,因为您的存储桶策略不会应用于这些文件(在我看来,这似乎是亚马逊的疏忽,但我确信我没有想到有充分的理由)

我正在使用rails,有没有办法在桶中设置对象的所有者。

编辑

我想一个更好的问题可能是......

有没有办法设置亚马逊存储桶,以便它将存储桶策略应用于所有文件,而不管所有者如何。

最佳答案

事实证明,S3 的另一个限制是您似乎无法更改存储桶中对象的所有者。这使得存储桶策略在这种情况下毫无用处。作为一种变通方法,我不得不重新使用 ACL。您可以像这样使用 rails AWS-SDK gem 设置公共(public) ACL。

class AwsHelper

# This method can be used to set a public acl on any object. The parameter file_path
# will be the path to the file in the bucket minus the domain info, so if your full url was
# http://s3.amazonaws.com/<your-bucket>/images/image1.png, file path would be
# images/image1.png
def self.set_public_acl(file_path)

@bucket_path = ENV['S3_BUCKET']

Rails.logger.warn "===> Loading S3"
s3 = AWS::S3.new

if(s3)
bucket = s3.buckets[@bucket_path]

if(bucket.exists?)
Rails.logger.warn "===> Bucket '#{@bucket_path}' FOUND"

key = bucket.objects[file_path]

if(key.exists?)
Rails.logger.warn "===> Key '#{file_path}' FOUND"

key.acl = :public_read

Rails.logger.warn "===> ACL Set to public read:"
key.acl.grants.each { |grant| Rails.logger.warn "grantee => #{grant.grantee.group_uri}, permission => #{grant.permission.name}"}

return key
end
end
end
end

end

如果您无法控制创建内容的用户,但您仍然希望它是私有(private)的(例如,当使用某些品牌的基于 Web 的视频编码时),您可以通过在创建文件后复制文件来实现此目的(您的帐户将拥有该副本),删除旧的,然后将其复制回来。不理想,但它有效。

关于ruby-on-rails-3 - 在 S3 存储桶中设置对象的所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com