Como verificar a senha de um usuário no Devise


96

Estou tendo um problema de correspondência de senha de usuário usando devise gem in rails. A senha do usuário armazenada no meu banco de dados é criptografada_senha e estou tentando encontrar o usuário por senha, mas não entendo como fazer a correspondência da senha do formulário com a senha_de_criptada no meu banco de dados.

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

3
Acho que a resposta correta foi oferecida. Você pode selecioná-lo?
Brendon Muir,

Respostas:


269

Acho que esta é uma maneira melhor e mais elegante de fazer isso:

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

O outro método em que você gerou o resumo da instância do usuário estava me fornecendo erros de método protegido.


2
o resumo da senha está protegido, você pode contorná-lo desta forma. User.new.send (: password_digest, 'password')
Mark Swardstrom

mas isso levaria a adivinhar a senha do usuário em algum contexto, como verificar a senha e ainda se beneficiar da proteção contra estrangulamento?
simo

19

Use métodos Devise

O Devise fornece métodos integrados para verificar a senha de um usuário :

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

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

Para Rails 4+ com parâmetros fortes , você pode fazer algo assim:

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

Trabalha para meu projeto. Obrigado.
zmd94

6

Acho que o melhor será esse

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

4
Isso definiria o usuário para um valor booleano (se a senha era válida ou não).
Ryan Taylor

0

Eu sugeriria isso.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.