我想直接在数据库中重置用户的密码。我可以看到密码通常存储为加密的哈希 - 我的选择是什么?
我正在使用Devise。
答案 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,但它似乎没有做你想要的。