如何在Devise中验证用户的密码

pop*_*rul 94 ruby-on-rails devise

我在rails中使用devise gem匹配用户密码时遇到问题.存储在我的数据库上的用户密码是encrypted_pa​​ssword,我试图通过密码查找用户,但我不明白如何匹配表格中的密码和我的数据库中的encrypted_pa​​ssword.

User.find_by_email_and_password(params[:user][:email], params[:user][:password])
Run Code Online (Sandbox Code Playgroud)

jos*_*dan 262

我认为这是一种更好,更优雅的方式:

user = User.find_by_email(params[:user][:email])
user.valid_password?(params[:user][:password])
Run Code Online (Sandbox Code Playgroud)

从用户实例生成摘要的另一种方法是给我受保护的方法错误.

  • +1,password_digest也给我带来了受保护的方法错误 (2认同)
  • 密码摘要受保护,您可以通过这种方式解决它。User.new.send(:password_digest,'password') (2认同)

She*_*yar 17

使用设计方法

Devise为您提供了验证用户密码的内置方法:

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

user.valid_password?(params[:user][:password])
Run Code Online (Sandbox Code Playgroud)

对于具有强Params的Rails 4+,您可以执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)


Amr*_*ana 6

我认为更好的是这个

valid_password = User.find_by_email(params[:user][:email]).valid_password?(params[:user][:password])
Run Code Online (Sandbox Code Playgroud)

  • 这会将用户设置为布尔值(密码是否有效). (4认同)