我在:show
的{{1}}行动中有这个。
users_controller
但是在users表中有一些我不想从def show
@user = User.find(params[:id])
end
实例变量访问的列。
有@user
列和encrypted_password
列。我可以在模型或控制器上执行哪些操作,以确保salt
没有@user
或password
值。
我希望当我执行salt
或@user.password
时,它会返回@user.salt
或无法破坏用户安全性的内容。
答案 0 :(得分:3)
答案 1 :(得分:2)
不要以未加密的格式将密码存储在数据库中。如初。
Hiding an attribute in an ActiveRecord model提供了一些有关如何隐藏模型类中各种属性的基本信息。
最好的方法是从一些中间对象为你的控制器提供一个外观,并且该方面基本上只暴露控制器需要操作的那些字段。
答案 2 :(得分:0)
您可以在模型中添加after_find回调...
class User << ActiveRecord::Base
after_find :nil_secure_fields
def nil_secure_fields
password = nil
salt = nil
end
end
如果记录已更新,您需要确保密码和salt属性不包含在要更新的属性中。
答案 3 :(得分:0)
对于User
模型添加
class << self
def find_secure(id)
user = self.find(id)
user.secure_attributes!
user
end
end
def secure_attributes!
@attributes_secure = true
end
def secure_attributes?
!!@attributes_secure
end
def encrypted_password
secure_attributes? ? nil : super
end
def salt
secure_attributes? ? nil : super
end
现在,您可以使用find_secure
方法代替find
,这将限制对安全属性的访问。
PS这并不能避免存储加密密码的需要。