Jak zweryfikować hasło użytkownika w Devise

96

Mam problem z dopasowaniem hasła użytkownika za pomocą devise gem w railsach. Hasło użytkownika przechowywane w mojej bazie danych, czyli zaszyfrowane_hasło i próbuję znaleźć użytkownika według hasła, ale nie rozumiem, jak dopasować hasło z formularza i zaszyfrowane_hasło w mojej bazie danych.

User.find_by_email_and_password(params[:user][:email], params[:user][:password])
poporul
źródło
3
Myślę, że podano poprawną odpowiedź. Czy możesz to wybrać?
Brendon Muir

Odpowiedzi:

269

Myślę, że to lepszy i bardziej elegancki sposób na zrobienie tego:

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

Inną metodą, w której generujesz podsumowanie z wystąpienia użytkownika, były błędy chronionych metod.

joshaidan
źródło
2
skrót hasła jest chroniony, możesz obejść go w ten sposób. User.new.send (: password_digest, 'password')
Mark Swardstrom
ale w pewnym kontekście doprowadziłoby to do odgadnięcia hasła użytkownika, jak sprawdzić hasło i nadal korzystać z ochrony przed ograniczeniem przepustowości?
simo
19

Użyj metod opracowanych

Devise zapewnia wbudowane metody weryfikacji hasła użytkownika :

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

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

Dla Rails 4+ z Strong Params możesz zrobić coś takiego:

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
Sheharyar
źródło
Działa dla mojego projektu. Dzięki.
zmd94
6

Myślę, że tym lepszym będzie ten

valid_password = User.find_by_email(params[:user][:email]).valid_password?(params[:user][:password])
Amrit Dhungana
źródło
4
To ustawiłoby użytkownika na wartość logiczną (niezależnie od tego, czy hasło było prawidłowe, czy nie).
Ryan Taylor
0

Sugerowałbym to.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Roshan
źródło