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