Вот история:
Я планирую к пользовательской Скрепке контакт с загрузками.
Если я храню изображения под "RAILS_ROOT/public/images", кто-либо, кто мог бы предположить, что название файлов могло бы получить доступ к файлам. (например, получая доступ к http://example.com/public/images/uploads/john/family.png)
Я должен показать использование изображений img
теги, таким образом, я не могу поместить файл кроме public
.
Как я могу удостовериться, что изображения пользователя или группы не доступны другими?
(Если я не могу достигнуть этого со Скрепкой, что такое хорошее решение?)
Я бы попросил Paperclip использовать S3 на внутреннем сервере, установить для загружаемых файлов статус private, а затем использовать "Query String Request Authentication Alternative" для генерации URL для моих тегов изображений.
http://docs.amazonwebservices.com/AmazonS3/2006-03-01/index.html?RESTAuthentication.html
Вы можете заставить ваш сервер rails выводить содержимое файлов изображений. Это делается через действие контроллера (большинство действий выводят HTML, но это действие выводит, например, JPG).
Затем вы можете использовать вашу систему авторизации для ограничения доступа на уровне контроллера!
class ImagesController
#Default show Image method streams the file contents.
#File doesn't have to be in public/ dir
def show
send_file @image.filename, :type => @image.content_type,
:disposition => 'inline'
end
# Use your favorite authorization system to restrict access
filter_access_to :show, :require => :view, :attribute_check => :true
end
В HTML-коде вы можете использовать:
<img src="/images/show/5" />
Вот как я сделал это в аналогичном приложении.
Мой метод выглядит так:
def s3_url(style = :original, time_limit = 30.minutes)
self.attachment.s3.interface.get_link(attachment.s3_bucket.to_s, attachment.path(style), time_limit)
end