在 S3 和 cloudfront 上使用 rails carrierwave 私有文件

Posted

技术标签:

【中文标题】在 S3 和 cloudfront 上使用 rails carrierwave 私有文件【英文标题】:rails carrierwave private files on S3 and cloudfront 【发布时间】:2013-09-13 21:39:59 【问题描述】:

我有从 Amazon 云端服务器提供的公共和私人文件,公共文件可以正常工作,但现在我想通过经过身份验证的读取将其中一些文件保护为私人文件。

私有文件有自己的 Uploader DocumentUploader,文件是否需要存储在单独的桶中?就像现在一样,它们都在一个桶中。

不久前我用 Paperclip 做过类似的事情,但似乎找不到一个很好的资源来用 Carrierwave 做这件事并使用定时的 Authenticated_url

我看到他们在这里有类似的东西:

http://www.rdoc.info/github/jnicklas/carrierwave/5d1cb7e6a4e8a4786c2b/CarrierWave/Storage/Fog/File#authenticated_url-instance_method

但我不确定如何实现它。

任何提示将不胜感激。

【问题讨论】:

【参考方案1】:

取决于安全程度,但您可以在特定的 Uploader 类本身上设置文件权限,覆盖默认权限,如下所示:

class SomeUploader < CarrierWave::Uploader::Base

  def fog_public
    false
  end

  def fog_authenticated_url_expiration
    5.minutes # in seconds from now,  (default is 10.minutes)
  end
  .....

这将自动导致来自此上传器的文件现在附加临时 AWS 到期和访问密钥,并且未来的上传将设置为私有,即不可公开访问。

https://s3.amazonaws.com/uploads/something/1234/124.pdf?AWSAccessKeyId=AKIAJKOSTQ6UXXLEWIUQ&Signature=4yM%2FF%2F5TV6t4b1IIvjseenRrb%2FY%3D&Expires=1379152321

【讨论】:

太棒了。这个答案来自 2013 年,我刚刚使用 Rails 5.x 和最新的 Carrierwave 进行了测试,并且仍然像魅力一样工作!如果您在生产存储桶上上线后实施此操作,则需要返回并更新这些资产的 ACL。【参考方案2】:

据我所知here,您可能需要为受保护的文件创建另一个存储桶。

您可以自己实现“私有”文件的安全性,在您的模型(如果有)中,您可以添加一个字段来检查文件是否安全,然后您可以使用您的控制器。

您可以使用的一个不错的宝石是cancan。有了它,您可以根据用户的个人资料管理模型和一些属性(安全字段)并提供或不提供授权。

【讨论】:

【参考方案3】:

您可以在单独的上传器中设置carrierwave 配置。像这样。

使用 gem 'aws-sdk', '~> 2.10' gem 'carrierwave-aws', '~> 1.1'

    class BusinessDocumentUploader < CarrierWave::Uploader::Base

    def initialize(*)
      super



      CarrierWave.configure do |config|
      config.storage    = :aws
      config.aws_bucket = Rails.application.secrets.aws_bucket
      config.aws_acl    = 'private'

    #acl: "private", # accepts private, public-read, public-read-write, authenticated-read, aws-exec-read, bucket-owner-read, bucket-owner-full-control
      # Optionally define an asset host for configurations that are fronted by a
      # content host, such as CloudFront.
      config.asset_host = Rails.application.secrets.aws_asset_host

      # The maximum period for authenticated_urls is only 7 days.
      config.aws_authenticated_url_expiration = 60 * 60 * 24 * 7
      # config.aws_authenticated_url_expiration = 2

      # Set custom options such as cache control to leverage browser caching
      config.aws_attributes = 
        expires: 1.week.from_now.httpdate,
        cache_control: 'max-age=604800'
      

      config.aws_credentials = 
        access_key_id:     Rails.application.secrets.aws_access_key_id,
        secret_access_key: Rails.application.secrets.aws_secret_access_key,
        region:            Rails.application.secrets.aws_region # Required
      

    end

    end
    end

【讨论】:

以上是关于在 S3 和 cloudfront 上使用 rails carrierwave 私有文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3和Cloudfront单个文件带宽?

Chrome S3 Cloudfront:初始和加载请求上没有“Access-Control-Allow-Origin”标头

Amazon S3 和 Cloudfront 上的 Node.js 服务器

Amazon S3 + CloudFront CORS 问题

使用 CloudFront 和目录重定向的 AWS S3 静态网站托管

我需要使用 cloudfront 和 s3 重定向我的 url