Come verificare la password di un utente in Devise


96

Ho un problema con la corrispondenza della password utente utilizzando devise gem in rails. Password utente memorizzata sul mio database che è encrypted_password e sto cercando di trovare l'utente tramite password, ma non capisco come abbinare la password dal modulo e encrypted_password nel mio db.

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

3
Penso che sia stata offerta la risposta corretta. Puoi selezionarlo?
Brendon Muir

Risposte:


269

Penso che questo sia un modo migliore e più elegante per farlo:

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

L'altro metodo in cui generi il digest dall'istanza utente mi dava errori di metodo protetto.


2
password digest è protetto, puoi aggirarlo in questo modo. User.new.send (: password_digest, 'password')
Mark Swardstrom

ma questo porterebbe a indovinare la password dell'utente in un certo contesto, come controllare la password e continuare a beneficiare della protezione dal throttling?
simo

19

Usa metodi Devise

Devise fornisce metodi integrati per verificare la password di un utente :

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

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

Per Rails 4+ con Strong Params , puoi fare qualcosa del genere:

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

Funziona per il mio progetto. Grazie.
zmd94

6

Penso che il migliore sarà questo

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

4
Ciò imposterebbe l'utente a un valore booleano (indipendentemente dal fatto che la password fosse valida o meno).
Ryan Taylor

0

Suggerirei questo.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.