web-dev-qa-db-fra.com

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

J'ai un problème pour faire correspondre le mot de passe de l'utilisateur à l'aide de gem gem dans 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 encrypted_password dans ma base de données.

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

Je pense que c'est une façon 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 d'utilisateur me donnait des erreurs de méthode protégées.

258
joshaidan

Utiliser des méthodes de conception

Devise vous fournit 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 des paramètres forts , 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
14
Sheharyar

Je pense que le meilleur sera celui-ci

valid_password = User.find_by_email(params[:user][:email]).valid_password?(params[:user][:password])
6
Amrit Dhungana
user = User.find_by_email_and_password(params[:user][:email])
user.valid_password?(params[:user][:password])

@joshaidan est la vraie réponse

4
Zainal

Je suggérerais ceci.

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