使用敏感信息(如密码)rails保护数据库列

时间:2015-09-24 05:33:38

标签: ruby-on-rails

我有一个rails应用程序,喜欢这么多rails应用程序,有用户。在我的用户模型中,我有passwordsalt列等。有什么方法可以保护我不会出现这种情况,例如debug @user或我渲染JSON时?

当然,我可以确保每次使用时都省略这些,但有没有办法可以确保它们不会出现在任何地方?

也许他们可能是私人领域?它们仅在我的User模型和我的Session控制器中需要,但我可以在User中创建一个方法,将给定的密码与正确的密码进行比较,然后只在'用户'模块。这会有所帮助,还是会在这两个地方(和其他地方)呈现?

1 个答案:

答案 0 :(得分:1)

非常好的问题,有几件事需要考虑:

  
      
  1. 您是否希望"私有化" 模型 Rails核心中的值?
  2.   
  3. 您是否需要在任何特定情况下访问这些属性? (IE是总是私有?)
  4.   
  5. 如何填充私有方法?他们会改变吗?
  6.   

我必须诚实地说我不知道​​答案。由于我感兴趣,我做了一些研究。以下是一些资源:

如果您采用Rails 模型并应用每次填充它的逻辑,它的属性将成为实例方法,您的共识似乎是可以开始在模型本身内私有化这些方法。

例如......

#app/models/user.rb
class User < ActiveRecord::Base
    private :password, :password=
    private :salt, :salt=
end

这个似乎让你能够在你的模型中私有化某些方法,这将回答你问题的一半。但是,它仍然存在ActiveRecord每次拉动记录的可能性,这可能是一种危险。

我看了一下,发现有一些方法可以操纵ActiveRecord以防止它吸引不需要的数据:

此资源建议使用active_record_serializers。这看起来特别针对JSON,但更接近正确的轨道(IE能够定义我们从ActiveRecord查询返回的数据)。

#serializer
class UserSerializer < ActiveModel::Serializer
  attributes :username, :created_at
end

#controller
render json: @user, serializer: UserSerializer

还有另一个ActiveRecord Lazy Attributes的建议 - 规定ActiveRecord要加载哪些属性:

#app/models/user.rb
class User < ActiveRecord::Base
  attr_lazy :data
end

最后,你总是有good ol' default_scope

#app/models/user.rb
class User < ActiveRecord::Base
   default_scope select([:id, :username])
end