【问题标题】:rails carrierwave private files on S3 and cloudfront在 S3 和 cloudfront 上使用 rails carrierwave 私有文件
【发布时间】: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

但我不确定如何实现它。

任何提示将不胜感激。

【问题讨论】:

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


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2016-11-13
        • 2016-07-23
        • 2012-04-14
        • 2016-06-29
        • 2012-10-11
        • 1970-01-01
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多