Я поддерживаю приложение для направляющих, которое имеет содержание в общественности / папка, которая должна будет теперь быть защищена входом в систему. Мы полагаем, что перемещение тех папок файлов в путь за пределами общественности / и запись контроллера направляющих подает содержание.
Прежде чем мы начнем писать это, мне было любопытно, если кто-либо еще имеет, столкнулся с этим видом проблемы? Я искал некоторые драгоценные камни / плагины, которые могли бы уже сделать это, но ничего не нашли. Кто-либо создал драгоценный камень для этого?
Вы можете использовать Amazon S3. Вы можете использовать контроллеры для генерации и обслуживания URL-адресов за безопасной областью, и она также имеет функцию, которая в основном предоставляет ресурсы, доступные только в течение определенного времени, когда URL-адрес генерируются.
Проверьте этот URL: http://docs.amazonwebservices.com/amazons3/2006-03-01/index.html?restauthentication.html
Я сделал это на сайте, где люди платят, чтобы загрузить определенные файлы, и файлы хранятся в Rails_root / Private
. Первое, что нужно знать, так это то, что вы хотите, чтобы веб-сервер обрабатывал отправку файла, в противном случае ваше приложение будет задержено передавать большие файлы, и это быстро принесет ваш сайт в HALT, если у вас есть какой-либо тип загрузки. Таким образом, если вам нужно проверить авторизацию в контроллере, вам также нужен способ передачи управления загрузкой обратно на веб-сервер. Лучший способ сделать это (что я знаю) - заголовок X-SendFile, который поддерживается Nginx, Apache (с модулем) и другими. С помощью C-SendFile Confived, когда ваш веб-сервер получает заголовок X-SendFile
в заголовке из вашего приложения, он берет на себя отправку файла к клиенту.
Как только у вас будет X-SendFile, работающий на веб-сервере, метод частного контроллера, как это полезно:
##
# Send a protected file using the web server (via the x-sendfile header).
# Takes the absolute file system path to the file and, optionally, a MIME type.
#
def send_file(filepath, options = {})
options[:content_type] ||= "application/force-download"
response.headers['Content-Type'] = options[:content_type]
response.headers['Content-Disposition'] = "attachment; filename=\"#{File.basename(filepath)}\""
response.headers['X-Sendfile'] = filepath
response.headers['Content-length'] = File.size(filepath)
render :nothing => true
end
, то действие вашего контроллера может выглядеть что-то подобное:
##
# Private file download: check permission first.
#
def download
product = Product.find_by_filename!(params[:filename])
if current_user.has_bought?(product) or current_user.is_superuser?
if File.exist?(path = product.filepath)
send_file path, :content_type => "application/pdf"
else
not_found
end
else
not_authorized
end
end
, очевидно, ваш метод авторизации будет варьироваться Необходимо менять заголовки, если вы предлагаете файлы, отличные от PDF, или вы хотите, чтобы файл был просмотрен в браузере (избавиться от приложения / Force-Download
Тип содержимого).
Если вы хотите завязать доставку контента со своими рельсами аутентификации и системой авторизации, вам по существу вам придется поставить контент за контроллером.
Если вы смотрите на более простой вход в систему, вы можете обрабатывать его с HTTP Auth и Settings в вашей среде хостинга (например, используя HTACCESS).
AFAIK, X-SendFile не поддерживается nginx. У Nginx есть собственное расширение, позволяющее это сделать, под названием X-Accel-Redirect.
Более подробную информацию об этом вы найдете здесь: https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/
На github также есть плагин rails, реализующий эту функцию: goncalossilva / X-Accel- Перенаправление