如何最好地保护Rails中的记录?

时间:2009-07-20 15:31:18

标签: ruby-on-rails

我的数据库中有一些记录,只允许拥有用户或管理员查看/编辑等。

在应用程序级别保护这些记录的最佳方法是什么,以便只有这些人才能看到这些记录?我可以用条件手动完成这个,但我需要确保在每个find()上使用相同的条件。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

在大多数情况下,将查找程序范围限定为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

答案 1 :(得分:2)

我发现最好的方法是避免像这样的实际模型的发现者......

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

而是使用用户对象的集合

class User
  has_many :secret_records
end

current_user.secret_records.find(id)

这会自动将select范围限定为属于当前用户的那些秘密记录。

  • 我假设您的身份验证系统提供了一个名为current_user的变量(例如restful_authentication)

答案 2 :(得分:1)

在所有可用于访问此信息的控制器前面放置一个过滤器

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

如果不满足此条件,请将其重定向到其他地方