使用敏感信息(如密码)rails保护数据库列
我有一个rails应用程序,喜欢这么多rails应用程序,有用户。 在我的用户模型中,我有password
和salt
列等。 有什么方法可以保护这些不会出现在我debug @user
或我渲染JSON
?
当然,我可以确保每次使用时都省略这些,但有没有办法可以确保它们不会出现在任何地方?
也许他们可能是私人领域? 它们仅在我的User
模型和我的Session
控制器中需要,但我可以在User
中创建一个方法,将给定的密码与正确的密码进行比较,然后只在“用户”模块中访问变量。 这会有所帮助,还是会在这两个地方(和其他地方)呈现?
非常好的问题,有几件事需要考虑:
- 您是否希望将模型或Rails核心中的值“私有化”?
- 您是否需要在任何特定情况下访问这些属性? (IE是否总是私有的?)
- 如何填充私有方法? 他们会改变吗?
我必须诚实地说我不知道答案。 由于我很感兴趣,我做了一些研究。 以下是一些资源:
- 有没有办法让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