1

パスワードを変更するために、ユーザーに現在のパスワードを正常に確認してもらいたい。最初はcontroller#updateに何かあったのですが、仮想属性にエラーを追加しても保存が妨げられなかったのでインスタンスが無効にならないようです。

has_secure_password を使用しています。モデルの検証に切り替えましたが、認証が false を返すため、以下のコードは常に検証に失敗します。コンソールでいくつかのテストを行ったところ、

user = User.first
user.current_password = 'thecurrentpassword'
user.password = 'thenewpassword'
user.valid?  => false
user.authenticate('thecurrentpassword') => false
user.authenticate('thenewpassword') => true ... before saving

それで、保存の代わりに新しいパスワードの割り当て時に password_digest がリセットされるようですか? モデルまたはコントローラーレイヤーで current_password が間違っている場合、これを回避してレコードが保存されないようにするにはどうすればよいですか?

validate  :validate_current_password, if: Proc.new{ |u| u.persisted? and u.password.present? }

  def validate_current_password
    unless authenticate(current_password)
      errors.add(:current_password, 'invalid password')
    end
  end
4

1 に答える 1

2

次のようなクラスメソッドを追加できます。

class User
  def self.authenticate(email, password)
    find_by_email(email).try(:authenticate, password)
  end
end

これで、どのコントローラーも、特定の電子メールとパスワードの組み合わせが有効なユーザーであるかどうかを確認できます。

于 2012-04-07T13:13:02.253 に答える