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])
poporul
fuente
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.

Joshaidan
fuente
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
Sheharyar
fuente
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])
Amrit Dhungana
fuente
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)
Roshan
fuente