我正在使用“has_secure_password”方法在数据库中存储安全密码。当管理员创建用户时(在我的应用程序中创建用户,用户无法自己创建帐户),在用户模型中,password_digest由创建随机密码的方法填充(请参阅代码)。保存记录后,保存安全。所以用户方法是创建一个password_digest说“TY5665 ^%^”,然后将它保存在数据库中说“Y ^ 6& $ d%$ 56GFT”。太好了!
before_validation :create_random_password, :on => :create
def create_random_password
self.password_digest = SecureRandom.hex(5)
end
但是当新用户登录并在其个人资料中更改密码时,新密码会保存好,但不安全!假设用户将其更改为“password1”,它也会在数据库中保存为“password1”。那么为什么安全密码在创建时工作,而不是在更新?
答案 0 :(得分:1)
如果没有看到更新代码,请确保您的更新是:password,而不是:password_digest。创建密码哈希背后的魔力:password_digest仅以:password。
开头很惊讶您可以将自己的密码直接保存到:password_digest,它可以在进行身份验证时使用。我认为它需要用户提供的密码,哈希,然后将哈希值比较:password_digest(可能不是他们的密码)。
这就是我所做的,这可能会解决问题:
before_create :set_temporary_password
def set_temporary_password
self.temporary_password = SecureRandom.hex(5)
end
发送用户self.temporary_password,当他们更新它时,将temporary_password更改为nil。然后,您可以知道用户何时拥有需要更改的临时密码。