So überprüfen Sie das Kennwort eines Benutzers in Devise

96

Ich habe ein Problem beim Abgleichen des Benutzerkennworts mit Devise Gem in Rails. Das auf meiner Datenbank gespeicherte Benutzerkennwort lautet encrypted_password und ich versuche, den Benutzer anhand des Kennworts zu finden. Ich verstehe jedoch nicht, wie das Kennwort aus dem Formular und dem verschlüsselten Kennwort in meiner Datenbank abgeglichen werden kann.

User.find_by_email_and_password(params[:user][:email], params[:user][:password])
poporul
quelle
3
Ich denke, die richtige Antwort wurde angeboten. Kannst du es auswählen?
Brendon Muir

Antworten:

269

Ich denke, dies ist eine bessere und elegantere Art, dies zu tun:

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

Die andere Methode, mit der Sie den Digest aus der Benutzerinstanz generieren, gab mir geschützte Methodenfehler.

Joshaidan
quelle
2
Passwort Digest ist geschützt, Sie können es auf diese Weise umgehen. User.new.send (: password_digest, 'password')
Mark Swardstrom
Dies würde jedoch dazu führen, dass das Benutzerkennwort in einem bestimmten Kontext erraten wird. Wie kann man das Kennwort überprüfen und trotzdem vom Drosselungsschutz profitieren?
Simo
19

Verwenden Sie Gerätemethoden

Devise bietet Ihnen integrierte Methoden zum Überprüfen des Kennworts eines Benutzers :

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

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

Für Rails 4+ mit starken Parametern können Sie Folgendes tun:

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
quelle
Funktioniert für mein Projekt. Vielen Dank.
zmd94
6

Ich denke, das Bessere wird das sein

valid_password = User.find_by_email(params[:user][:email]).valid_password?(params[:user][:password])
Amrit Dhungana
quelle
4
Dies würde den Benutzer auf einen booleschen Wert setzen (unabhängig davon, ob das Kennwort gültig ist oder nicht).
Ryan Taylor
0

Ich würde das vorschlagen.

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