Cómo verificar la contraseña de un usuario en Devise


96

Tengo un problema para hacer coincidir la contraseña de usuario usando devise gem in rails. Contraseña de usuario almacenada en mi base de datos que es encrypted_password y estoy tratando de encontrar al usuario por contraseña, pero no entiendo cómo hacer coincidir la contraseña del formulario y la contraseña cifrada en mi base de datos.

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

3
Creo que se ha ofrecido la respuesta correcta. ¿Puedes seleccionarlo?
Brendon Muir

Respuestas:


269

Creo que esta es una forma mejor y más elegante de hacerlo:

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

El otro método en el que genera el resumen a partir de la instancia del usuario me estaba dando errores de método protegido.


2
El resumen de contraseña está protegido, puede evitarlo de esta manera. User.new.send (: password_digest, 'contraseña')
Mark Swardstrom

pero esto llevaría a adivinar la contraseña del usuario en algún contexto, ¿cómo verificar la contraseña y aún así beneficiarse de la protección de estrangulamiento?
simo

19

Utilice métodos de diseño

Devise le proporciona métodos integrados para verificar la contraseña de un usuario :

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

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

Para Rails 4+ con Strong Params , puede hacer algo como esto:

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

Funciona para mi proyecto. Gracias.
zmd94

6

Creo que el mejor será este

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

4
Eso establecería al usuario en un valor booleano (si la contraseña era válida o no).
Ryan Taylor

0

Sugeriría esto.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.