Как проверить пароль пользователя в программе

У меня возникла проблема с совпадением пароля пользователя с помощью devem gem в rails. Пароль пользователя, хранящийся на моем db, который является encrypted_password, и я пытаюсь найти пользователя по паролю, но я не понимаю, как совместить пароль из формы и encrypted_password в моем db.

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

Ответ 1

Я думаю, что это лучший и более элегантный способ сделать это:

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

Другой метод, в котором вы генерируете дайджест из экземпляра пользователя, дает мне защищенные ошибки метода.

Ответ 2

Использовать методы разработки

Devise предоставляет вам встроенные методы проверки пароля пользователя:

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

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

Для 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

Ответ 3

Я думаю, что лучшим будет этот

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

Ответ 4

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

@joshaidan - верный ответ

Ответ 5

Я бы предложил это.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)