Как лучше защитить записи в Rails? - PullRequest
1 голос
/ 20 июля 2009

В моей базе данных есть записи, которые разрешено просматривать / редактировать и т. Д. Только владельцам или администраторам.

Каков наилучший способ защитить эти записи на уровне приложения, чтобы только эти люди могли видеть эти записи? Я мог бы сделать это вручную с условиями, но мне нужно было бы убедиться, что я использую одни и те же условия при каждом поиске ().

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 20 июля 2009

Определение области поиска для current_user полезно в большинстве случаев, но не учитывает, что пользователь является администратором и имеет доступ к объектам, с которыми он не связан напрямую.

Создайте именованную область в модели, чтобы ограничить выбор записями, принадлежащими пользователю, или любой, если указанный пользователь является администратором. Модель User должна реализовывать метод с именем "is_admin?" возвращает true, если пользователь считается администратором.

Так вы можете позвонить:

my_widgets = Widget.accessible_by(user).find(:all, :conditions => ["created_at > ?", 1.day.ago.to_s(:db)])

class Widget
  named_scope :accessible_by, lambda {|u|
      conditions = nil        
      unless u.is_admin?
        conditions = ["widgets.user_id = :user_id", {:user_id => u.id}]
      end
      return {:conditions => conditions}
    }
end
2 голосов
/ 20 июля 2009

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

SecretRecord.find(:id, :conditions => 'user = ?', current_user.id)

и вместо этого использовать коллекции из пользовательского объекта

class User
  has_many :secret_records
end

current_user.secret_records.find(id)

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

  • Я предполагаю, что у вас есть переменная с именем current_user типа User, предоставленная вашей системой аутентификации (например, restful_authentication)
1 голос
/ 21 июля 2009

Установите фильтр перед всеми контроллерами, которые можно использовать для доступа к этой информации

current_user.admin? or params[:person_id].to_i == current_user.person.id

Если это условие не выполняется, перенаправьте их куда-нибудь еще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...