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

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

私有文件有自己的Uploader DocumentUploader,文件需要存储在不同的存储桶中吗? 就像现在一样,他们都在一个桶里。

我曾经用Paperclip做过类似的事情,但似乎找不到使用Carrierwave和使用定时Authenticated_url来做这件事的好资源

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

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

但我不确定如何实现它。

任何提示将非常感谢。

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

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

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

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

您可以在单独的上传器中设置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