0

我正在使用“has_secure_password”方式在数据库中存储安全密码。当管理员创建用户时(在我的应用程序中创建用户,用户不能自己创建帐户),在用户模型中,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”。那么为什么安全密码在创建时有效,但在更新时无效?

4

1 回答 1

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。然后您可以知道用户何时有需要更改的临时密码。

于 2012-06-27T13:38:41.553 回答