0

「has_secure_password」方式を使用して、データベースに安全なパスワードを保存しています。管理者がユーザーを作成する場合(私のアプリではユーザーが作成され、ユーザーは自分でアカウントを作成できません)、ユーザーモデルでは、パスワードダイジェストはランダムパスワードを作成するメソッドによって入力されます(コードを参照)。その後、レコードが保存されると、安全に保存されます。したがって、ユーザーメソッドは「TY5665 ^%^」というpassword_digestを作成し、「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_digest ではなく :password であることを確認してください。: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 に答える