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

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

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

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

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

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

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

  • 有没有办法让Rails ActiveRecord属性私有?
  • 隐藏ActiveRecord模型中的属性
  • ActiveRecord保护您的私人

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

例如…

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

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

我仔细研究了这一点,发现有一些方法可以操纵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懒惰属性的建议 - 向ActiveRecord规定要加载哪些属性:

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

最后,你总是有很好的' default_scope

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