Ruby on rails 如何在Rails中最好地保护记录?

Ruby on rails 如何在Rails中最好地保护记录?,ruby-on-rails,Ruby On Rails,我的数据库中有一些记录,只有拥有这些记录的用户或管理员才能查看/编辑这些记录 在应用程序级别保护这些记录的最佳方法是什么,这样只有这些人才能看到这些记录?我可以使用条件手动执行此操作,但我需要确保在每个find()上使用相同的条件 有什么想法吗?我发现最好的方法是避免像这样在实际模型上查找 SecretRecord.find(:id, :conditions => 'user = ?', current_user.id) 而是使用用户对象之外的集合 class User has_ma

我的数据库中有一些记录,只有拥有这些记录的用户或管理员才能查看/编辑这些记录

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


有什么想法吗?

我发现最好的方法是避免像这样在实际模型上查找

SecretRecord.find(:id, :conditions => 'user = ?', current_user.id)
而是使用用户对象之外的集合

class User
  has_many :secret_records
end

current_user.secret_records.find(id)
这会自动将select范围限定为属于当前用户的那些机密记录

  • 我假设您有一个名为current_user的变量,该变量的类型为身份验证系统提供的user(例如restful_身份验证)

我发现最好的方法是避免像这样在实际模型上查找

SecretRecord.find(:id, :conditions => 'user = ?', current_user.id)
而是使用用户对象之外的集合

class User
  has_many :secret_records
end

current_user.secret_records.find(id)
这会自动将select范围限定为属于当前用户的那些机密记录

  • 我假设您有一个名为current_user的变量,该变量的类型为身份验证系统提供的user(例如restful_身份验证)

在大多数情况下,将查找程序的范围限定为当前用户是有用的,但不能说明用户是管理员并且可以访问与其没有直接关联的对象

在模型中创建命名范围,以将选择限制为用户拥有的记录,或者如果指定的用户是管理员,则限制为任何记录。用户模型必须实现一个名为“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

在大多数情况下,将查找程序的范围限定为当前用户是有用的,但不能说明用户是管理员并且可以访问与其没有直接关联的对象

在模型中创建命名范围,以将选择限制为用户拥有的记录,或者如果指定的用户是管理员,则限制为任何记录。用户模型必须实现一个名为“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

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

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

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

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

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

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

…您如何处理管理员?嗯。。。抱歉,我错过了关于管理员的部分…你如何处理管理员?嗯。。。抱歉,我错过了关于管理员的部分。是否有某种方法可以通过始终运行来访问\u。所以你可以使用my_widgets=Widget.find(:all,:conditions=>[“created_at>?”,1.day.ago.to_s(:db)]是否有某种方法可以通过始终运行来访问_。因此,您可以使用my_widgets=Widget.find(:all,:conditions=>[“created_at>?”,1.day.ago.to_s(:db)])