1

ユーザーのパスワードをデータベースで直接リセットしたいと考えています。パスワードは通常、暗号化されたハッシュとして保存されていることがわかります。どのような選択肢がありますか?

私はDeviseを使っています。

4

2 に答える 2

2

「データベースに直接」と言ったことに気付きました。次に、最初のコメントが最も効果的です。

レールを介して(たとえば、移行で)まだ実行できる場合は、これを試すことができます:

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

その後、ケースに応じて、電子メール通知を送信するか、authentication_token をリセットすることができます。

于 2013-02-28T17:37:58.340 に答える
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

なぜDBで直接やりたいのですか?

必要に応じて、データベースの BCrypt (PostgreSQL の場合は pgcrypto など) と の値が必要になりますself.class.peper。私はbcrypt.saltBCryptによって提供されると仮定しています。

アップデート:

私は疑い始めています.pgcryptoにすぐにジャンプしますが、それはあなたが望むことをしていないようです.

于 2013-02-28T18:19:52.460 に答える