代码之家  ›  专栏  ›  技术社区  ›  Neil Middleton

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

  •  1
  • Neil Middleton  · 技术社区  · 16 年前

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

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

    有什么想法吗?

    3 回复  |  直到 11 年前
        1
  •  3
  •   codeprimate    16 年前

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

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

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

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

    而是使用用户对象的集合

    class User
      has_many :secret_records
    end
    
    current_user.secret_records.find(id)
    

    这会自动将选择范围限定为属于当前用户的机密记录。

    • 我假设您的身份验证系统提供了一个名为当前用户类型的变量(例如restful验证)
        3
  •  1
  •   nasmorn    16 年前

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

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

    如果不满足此条件,请将它们重定向到其他位置