2012-01-16 3 views
3

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

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

ответ

1

Поскольку в настоящее время я использую маршрутизируемую конечную точку, истекающие 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 непосредственно на туман инстанса хранения в стрекозы, например, в модели обратного вызова:

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

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

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

+0

Hi polarblau - Как вы получаете доступ к этой информации через свое приложение? Является ли ваше приложение веб-страницей? Если да, то какой синтаксис необходим для рендеринга изображений? – Tabrez

+0

Как уже упоминалось, я использую Dragonfly (камень Ruby), в данном случае с Rails. Вот документы: http://markevans.github.com/dragonfly/file.GeneralUsage.html – polarblau

+0

Hi Polarblau - Я задавал вопрос в контексте самой Стрекозы. Вы поделились кодом для обеспечения того, чтобы изображения на S3 были помечены как закрытые. Как получить доступ к этим изображениям из браузера конечного пользователя после их сохранения как «частного»? Используете ли вы код на стороне сервера для получения изображений, а затем записываете их в ответ на http, или используете ли вы что-то более удобное? Будет здорово, если вы сможете поделиться этой информацией. Я просмотрел документацию по стрекозам, и я не вижу ничего подобного. – Tabrez

2

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

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

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

+0

Спасибо, я проверю этот вариант и вернусь. – polarblau

1

Вы можете использовать устаревшие 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

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

+0

Спасибо, звучит интересно. Я также получаю изображения непосредственно через маршрутизированную конечную точку, которая является функцией dragonfly. Я должен посмотреть, смогу ли я сделать эту работу. – polarblau

Смежные вопросы