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.