「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」として保存されます。では、なぜ安全なパスワードは作成では機能するが、更新では機能しないのでしょうか。