在S3和cloudfront上运行carrierwave私有文件

时间:2013-09-10 08:53:56

标签: ruby-on-rails amazon-s3 ruby-on-rails-4 carrierwave amazon-cloudfront

我有来自亚马逊云端服务器的公共和私人文件,公共文件工作正常,但现在我想通过经过身份验证的读取来确保其中一些是私有的。

私有文件有自己的Uploader DocumentUploader,文件是否需要存储在不同的存储桶中?现在它们都在一个桶里。

我曾经用Paperclip做了类似的事情,但似乎找不到使用Carrierwave和使用定时Authenticated_url

的好资源

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

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

但我不确定如何实施它。

任何提示都将不胜感激。

3 个答案:

答案 0 :(得分:24)

取决于安全性,但您可以设置特定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

答案 1 :(得分:1)

据我所知here,您可能需要为安全文件创建另一个存储桶。

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

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

答案 2 :(得分:0)

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

使用

宝石&#39; aws-sdk&#39;,&#39;〜&gt; 2.10&#39; gem&#39; carrierwave-aws&#39;,&#39;〜&gt; 1.1&#39;

    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