我的数据库中有一些记录,只允许拥有用户或管理员查看/编辑等。
在应用程序级别保护这些记录的最佳方法是什么,以便只有这些人才能看到这些记录?我可以用条件手动完成这个,但我需要确保在每个find()上使用相同的条件。
有什么想法吗?
答案 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范围限定为属于当前用户的那些秘密记录。
答案 2 :(得分:1)
在所有可用于访问此信息的控制器前面放置一个过滤器
current_user.admin? or params[:person_id].to_i == current_user.person.id
如果不满足此条件,请将其重定向到其他地方