Rails: как защитить картинки, загруженные на S3 с помощью стрекозы - PullRequest
3 голосов
/ 17 января 2012

Я ищу способ защитить изображения, загруженные из приложения Heroku Rails 3, используя драгоценный камень-стрекозу в хранилище S3.Я хотел бы контролировать доступ на пользовательской основе и гарантировать, что изображения не могут быть доступны напрямую.

Я нашел некоторую информацию для других драгоценных камней, таких как скрепка, но поскольку стрекоза работает немного по-другому,Я не уверен, что является предпочтительным способом решения этого дела.

Ответы [ 3 ]

2 голосов
/ 17 января 2012

Dragonfly допускает опцию :expires для remote_url, которая является оберткой для url_for S3DataStore. Смотрите здесь . Как насчет установки ограниченной ссылки для скачивания, срок действия которой истекает через 10 секунд, как это происходит с paperclip ?

Вы также можете добавить случайные направляющие для ваших изображений в их URL, чтобы обеспечить большую безопасность в соответствии с этим SO вопросом .

Не настоящее решение, просто некоторые мысли.

1 голос
/ 03 апреля 2012

Поскольку я в настоящее время использую маршрутизируемую конечную точку, URL с истекшим сроком действия, к сожалению, не работают для меня.

Я обнаружил, что установка заголовка x-amz-acl для установки разрешений работает в моем случае, поскольку все изображения доступны только через приложение и никогда напрямую.

# config/initializers/dragonfly.rb
app = Dragonfly[:images]

if Rails.env.production?
  app.datastore.configure do |c|
    # […]
    c.storage_headers = {'x-amz-acl' => 'private'}
  end
end

Еще один способ сделать это программно для некоторых изображений можно получить, вызвав метод put_object_acl непосредственно в экземпляре хранилища Fog Dragonfly, например, в модели обратного вызова:

app = Dragonfly[:images]
app.datastore.storage.put_object_acl 'bucket-name', model.image_uid, 'private'

Это, конечно, будет работать только в том случае, если используемое хранилище фактически является хранилищем Fog, поэтому потребуется проверка.

У меня нет никаких тестов для этого решения в настоящее время, так как оно, похоже, требует большого количества насмешек. Так что, если у кого-то есть какие-либо отзывы об этом решении, я был бы очень признателен, если бы о нем узнали!

1 голос
/ 17 января 2012

Вы можете использовать устаревшие URL-адреса Amazon S3. Это подписанный URL, срок действия которого истек. Поэтому вы генерируете URL-адрес, даете его пользователю, и он может прочитать этот файл за отведенное время. Например, если вы загружаете изображения на странице, которая должна быть защищенной, установите срок действия 10 секунд или около того.

Файлы должны храниться как не для чтения, очевидно, для всего мира.

Смотря на Стрекозу, это выглядит довольно просто:

my_model.attachment.remote_url(:expires => 10.seconds.from_now)

Подробнее здесь: http://markevans.github.com/dragonfly/file.DataStorage.html#S3_datastore

Если это не сработает, я знаю, что Paperclip поддерживает это поведение, поскольку я использовал его несколько раз в прошлом.

...