99 votes

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 en utilisant la gemme devise dans rails. Le mot de passe de l'utilisateur est stocké dans ma base de données sous la forme d'un mot de passe crypté et j'essaie de trouver l'utilisateur par son mot de passe, mais je ne comprends pas comment faire correspondre le mot de passe du formulaire et le mot de passe crypté de ma base de données.

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

3 votes

Je pense que la bonne réponse a été proposée. Pouvez-vous la sélectionner ?

272voto

joshaidan Points 1368

Je pense que c'est une meilleure façon, 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 qui consiste à générer le condensé à partir de l'instance de l'utilisateur me donnait des erreurs de méthode protégée.

2 votes

Le résumé du mot de passe est protégé, vous pouvez le contourner de cette façon. User.new.send(:password_digest, 'password')

0 votes

Mais cela conduirait à deviner le mot de passe de l'utilisateur dans un certain contexte, comment vérifier le mot de passe tout en bénéficiant de la protection contre l'étranglement des appareils ?

30voto

Sheharyar Points 2063

Utiliser des méthodes élaborées

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 des paramètres forts vous pouvez faire quelque chose comme ça :

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

0 votes

Fonctionne pour mon projet. Merci.

6voto

Je pense que le meilleur sera celui-ci

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

4 votes

Cela donnerait à user une valeur booléenne (si le mot de passe est valide ou non).

0voto

Roshan Points 682

Je vous suggère ceci.

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

-2voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X