Как сохранить частные изображения и видео в Ruby on Rails

Вот история:

  • Пользователь A должен смочь загрузить изображение.
  • Пользователь A должен смочь установить конфиденциальность. ("Общедоступный" или "Частный").
  • Пользователь B не должен мочь получить доступ к "Частным" изображениям Пользователя A.

Я планирую к пользовательской Скрепке контакт с загрузками.

Если я храню изображения под "RAILS_ROOT/public/images", кто-либо, кто мог бы предположить, что название файлов могло бы получить доступ к файлам. (например, получая доступ к http://example.com/public/images/uploads/john/family.png)

Я должен показать использование изображений img теги, таким образом, я не могу поместить файл кроме public.

Как я могу удостовериться, что изображения пользователя или группы не доступны другими?

(Если я не могу достигнуть этого со Скрепкой, что такое хорошее решение?)

5
задан TK. 2 May 2010 в 05:09
поделиться

3 ответа

Я бы попросил Paperclip использовать S3 на внутреннем сервере, установить для загружаемых файлов статус private, а затем использовать "Query String Request Authentication Alternative" для генерации URL для моих тегов изображений.

http://docs.amazonwebservices.com/AmazonS3/2006-03-01/index.html?RESTAuthentication.html

4
ответ дан 18 December 2019 в 09:48
поделиться

Вы можете заставить ваш сервер 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" />
8
ответ дан 18 December 2019 в 09:48
поделиться

Вот как я сделал это в аналогичном приложении.

  • Храните свои изображения на Amazon S3 вместо локальной файловой системы. Paperclip поддерживает это.
  • В опциях Paperclip установите для :s3_permissions значение "private"
  • В модели Image определите метод, который позволяет выводить авторизованный, ограниченный по времени url для изображения.

Мой метод выглядит так:

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
  • Затем вы можете показывать изображения людям, только если они авторизованы для их просмотра (реализуйте это как вам нравится) - и не беспокоиться о том, что люди могут угадать/просмотреть приватные изображения. Это также позволяет им не передавать URL-адреса по кругу, поскольку срок их действия истекает (URL-адрес содержит маркер).
  • Имейте в виду, что вашему приложению потребуется время, чтобы сгенерировать авторизованные URL для каждого изображения. Поэтому, если на странице есть несколько изображений, это повлияет на время загрузки.
4
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: