Comment vérifier le mot de passe d'un utilisateur dans Devise

96

J'ai un problème pour faire correspondre le mot de passe de l'utilisateur à l'aide de la gemme dans les rails. Mot de passe utilisateur stocké sur ma base de données qui est encrypted_password et j'essaie de trouver l'utilisateur par mot de passe, mais je ne comprends pas comment faire correspondre le mot de passe du formulaire et le mot de passe encrypted_password dans ma base de données.

User.find_by_email_and_password(params[:user][:email], params[:user][:password])
poporul
la source
3
Je pense que la bonne réponse a été proposée. Pouvez-vous le sélectionner?
Brendon Muir

Réponses:

269

Je pense que c'est une manière meilleure et plus élégante de le faire:

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

L'autre méthode où vous générez le résumé à partir de l'instance utilisateur me donnait des erreurs de méthode protégée.

Joshaidan
la source
2
Le résumé du mot de passe est protégé, vous pouvez le contourner de cette façon. User.new.send (: password_digest, 'password')
Mark Swardstrom
mais cela conduirait à deviner le mot de passe de l'utilisateur dans un certain contexte, comment vérifier le mot de passe et toujours bénéficier de la protection contre la limitation?
simo
19

Utiliser les méthodes de conception

Devise vous fournit des méthodes intégrées pour vérifier le mot de passe d'un utilisateur :

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

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

Pour Rails 4+ avec Strong Params , vous pouvez faire quelque chose comme ceci:

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
la source
Fonctionne pour mon projet. Merci.
zmd94
6

Je pense que le meilleur sera celui-ci

valid_password = User.find_by_email(params[:user][:email]).valid_password?(params[:user][:password])
Amrit Dhungana
la source
4
Cela définirait l'utilisateur sur une valeur booléenne (que le mot de passe soit valide ou non).
Ryan Taylor
0

Je suggérerais ceci.

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