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])

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.


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

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])

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.