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

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.


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

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

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.