Deviseでユーザーのパスワードを確認する方法


96

Railsのdevise gemを使用して、ユーザーパスワードの照合に問題があります。ユーザーのパスワードはencrypted_pa​​sswordである私のdbに格納されており、ユーザーをパスワードで検索しようとしていますが、フォームのパスワードと私のdbのencrypted_pa​​sswordを一致させる方法がわかりません。

User.find_by_email_and_password(params[:user][:email], params[:user][:password])

3
正解は出たと思います。選べますか?
Brendon Muir 2013

回答:


269

私はこれがより良い、よりエレガントな方法だと思います:

user = User.find_by_email(params[:user][:email])
user.valid_password?(params[:user][:password])

ユーザーインスタンスからダイジェストを生成するもう1つの方法では、保護されたメソッドエラーが発生しました。


2
パスワードダイジェストは保護されているので、この方法で回避できます。User.new.send(:password_digest、 'password')
Mark Swardstrom

しかし、これは、いくつかのコンテキストでユーザーパスワードを推測することにつながります。どのようにパスワードをチェックし、それでもデバイスのスロットル保護から利益を得るでしょうか。
simo

19

工夫方法を使用する

Deviseには、ユーザーのパスワードを検証するための組み込みメソッドが用意されています

user = User.find_for_authentication(email: params[:user][:email])

user.valid_password?(params[:user][:password])

以下のために強力なのparamsとRailsの4+、あなたはこのような何かを行うことができます。

def login
  user = User.find_for_authentication(email: login_params[:email])

  if user.valid_password?(login_params[:password])
    user.remember_me = login_params[:remember_me]
    sign_in_and_redirect(user, event: :authentication)
  end
end

private
def login_params
  params.require(:user).permit(:email, :password, :remember_me)
end

私のプロジェクトで機能します。ありがとう。
zmd94

6

これがいいと思います

valid_password = User.find_by_email(params[:user][:email]).valid_password?(params[:user][:password])

4
これにより、ユーザーはブール値(パスワードが有効かどうか)に設定されます。
Ryan Taylor

0

これをお勧めします。

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.