Какова рабочая концепция для обслуживания защищенных / индивидуальных загрузок в Rails? - PullRequest
0 голосов
/ 22 июня 2009

Мне было интересно, как разрешить зарегистрированному пользователю загружать свои и только свои файлы на сервер. Например, никто, кроме меня, может загружать документы своих Документов Google, когда я вошел в систему. Есть ли страница с концепцией, на которую у вас есть ссылка, под рукой которой я могу прочитать? Есть ли книга, похожая на книгу рецептов, которая может более подробно и конкретно рассказать о реализации в Rails? И есть ли гем / плагин, который уже делает это?

Спасибо

Ответы [ 2 ]

1 голос
/ 24 июня 2009

Я бы предложил создать контроллер, ограничивающий доступ к загрузкам. Хитрость заключается в том, чтобы обслуживать файл через контроллер, а не напрямую из Apache. Я предполагаю, что вы используете RestfulAuthentication и Paperclip здесь:

Это модель (фотография с вложенным изображением)

class Photo < ActiveRecord::Base
  belongs_to :user

  has_attached_file :image, #:styles => {:thumbnail => "100x100#", :large => "800x600>"},
   :path => ":rails_root/assets/:attachment/:id_partition/:style/:basename.:extension",
   :url => "/assets/:userid/:attachment/:id/:style"
end

Обратите внимание на атрибут url, который в сочетании с маршрутом, приведенным ниже, заставит доступ к изображению через контроллер, а не напрямую из общедоступного каталога. Также обратите внимание на атрибут: path, который указывает личный каталог ресурсов вместо общедоступного по умолчанию.

map.assets 'assets/:userid/:attachment/:id/:style', :controller => 'assets', :action => 'get', :conditions => {:method => :get }

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

class AssetsController < ApplicationController
  before_filter :login_required

  def get
    if current_user.id == params[:userid].to_i
      @photo = Photo.find params[:id]
      send_file @photo.image.path(params[:style]), :type => @photo.image_content_type, :disposition => 'inline'
    else
      render :nothing => true
    end
  end
end

Вы также должны указать :x_sendfile => true в send_file, чтобы повысить производительность, позволив Apache взять на себя нагрузку по фактической обработке файла, как только ваш контроллер подтвердит его.

0 голосов
/ 22 июня 2009

"разрешить зарегистрированному пользователю загружать свои и только свои файлы на сервер"

У вас есть способ однозначно узнать, кому принадлежит какой файл? Это отправная точка, если, скажем, файлы являются изображениями, и вы хотите, чтобы я видел только мои изображения, то при сохранении (загрузке) изображений обязательно сохраняйте вместе с данными изображений мой идентификатор пользователя.

Так что, как только я вошел в систему, вы выбираете только то, что принадлежит мне. Взгляните на таблицу ниже (пример изображений, предполагая, что они хранятся в FileSystem)

фотографии (id, title, desc, file_name, user_id *) * Идентификатор пользователя - это идентификатор пользователя, который вошел в систему

Эти плагины могут помочь

  • RestFul аутентификация
  • ActiveACL (или любой другой плагин авторизации)
  • PaperClip (Загрузка файлов)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...