设计数据库中的重置密码?

时间:2013-02-28 17:28:25

标签: ruby-on-rails devise

我想直接在数据库中重置用户的密码。我可以看到密码通常存储为加密的哈希 - 我的选择是什么?

我正在使用Devise。

2 个答案:

答案 0 :(得分:2)

注意到你直接在数据库中说'。那么你得到的第一个评论效果最好。

如果您仍然可以通过rails(例如在迁移中)执行此操作,则可以尝试:

user = User.find(...)
# set plain text password, it will run 'encrypted_password=' under the hood
user.password = "new password" 
user.save                      

之后,您可能需要发送电子邮件通知或重置authentication_token,具体取决于您的情况。

答案 1 :(得分:1)

@ cjm2671,简短的回答是否定的,你不应该。请参阅https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L4

中的Devise如何做到这一点
  # Verifies whether an password (ie from sign in) is the user password.
  def valid_password?(password)
    return false if encrypted_password.blank?
    bcrypt   = ::BCrypt::Password.new(encrypted_password)
    password = ::BCrypt::Engine.hash_secret("#{password}#{self.class.pepper}", bcrypt.salt)
    Devise.secure_compare(password, encrypted_password)
  end

为什么要直接在数据库上执行此操作?

如果必须,您将需要数据库上的BCrypt(例如,PostgreSQL的pgcrypto)和self.class.peper的值。我假设BCrypt会提供bcrypt.salt

<强>更新

我开始怀疑是否有可能,我快速跳到pgcrypto,但它似乎没有做你想要的。