12

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

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

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

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

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

但我不确定如何实现它。

任何提示将非常感谢。

4

3 回答 3

27

取决于安全程度,但您可以在特定的 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-09-14T10:14:02.213 回答
1

据我在这里看到的,您可能需要为安全文件创建另一个存储桶。

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

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

于 2013-09-13T13:28:23.640 回答
1

您可以在单独的上传器中设置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
于 2018-03-14T10:05:33.413 回答