ユーザーが Paperclip を使用して S3 にファイルをアップロードし、別のグループがアップロードされたファイルをダウンロードできる Rails アプリを作成しています。ファイルを非公開にする必要があり、 :permissions => :private を使用しようとしましたが、これをオフにするとファイルをアップロードおよびダウンロードできます。
私は github の問題をフォローしています: https://github.com/thoughtbot/paperclip/wiki/Restricting-Access-to-Objects-Stored-on-Amazon-S3 and Rails 3, paperclip + S3 - Howto Store for an Instanceアクセスを保護しますが、まだ立ち往生しており、助けていただければ幸いです。これが私がこれまでに持っているものです:
モデル/user.rb
class User < ActiveRecord::Base
has_many :parts
...
if Rails.env.development?
has_attached_file :model
else
has_attached_file :model,
:storage => :s3,
:path => "files/:id/:basename.:extension",
:default_url => '/images/missing_:style.jpg',
:bucket => ENV['AWS_BUCKET'],
:s3_permissions => :private,
:s3_host_name => 's3-us-west-1.amazonaws.com',
:s3_credentials => {
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
end
user_controller.rb
def create
@user = User.new(params[:user])
@part = Part.new
if @user.save
...
end
end
def download
@user = User.find(params[:id])
redirect_to(@user.model.expiring_url(10))
end
part_controller.rb
class PartsController < ApplicationController
def index
@parts = Part.all
@users = User.all
end
end
ルート.rb
match 'users/download' => 'users#download', :as => 'download_model'
パーツ/index.html.erb
<p>
<% @parts.each do |part| %>
<p><%= part.model_name %></p>
<% end %>
<% @users.each do |user| %>
<p><%= link_to "Download", download_model_path(user) %></p>
<% end %>
</p>