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

96

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

User.find_by_email_and_password(params[:user][:email], params[:user][:password])
попорул
источник
3
Думаю, правильный ответ был предложен. Вы можете выбрать это?
Брендон Мьюир

Ответы:

269

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

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

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

Джошайдан
источник
2
дайджест пароля защищен, вы можете обойти его таким образом. User.new.send (: password_digest, 'пароль')
Марк Свардстрем,
но это привело бы к угадыванию пароля пользователя в некотором контексте, как проверить пароль и при этом получить выгоду от разработки защиты от удушения?
simo
19

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

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

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

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

Для Rails 4+ с Strong Params вы можете сделать что-то вроде этого:

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
Это установит для пользователя логическое значение (независимо от того, был ли пароль действителен или нет).
Райан Тейлор
0

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

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Рошан
источник