【问题标题】:How to verify a user's password in Devise如何在 Devise 中验证用户的密码
【发布时间】:2011-05-18 06:45:05
【问题描述】:

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

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

【问题讨论】:

  • 我认为已经提供了正确的答案。可以选择吗?

标签: ruby-on-rails devise


【解决方案1】:

使用设计方法

Devise 为您提供built-in methods to verify a user's password

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

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

对于 Rails 4+ with Strong Params,您可以执行以下操作:

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

【讨论】:

  • 适用于我的项目。谢谢。
【解决方案2】:

我会建议这个。

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

【讨论】:

    【解决方案3】:

    我认为更好的是这个

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

    【讨论】:

    • 这会将用户设置为布尔值(无论密码是否有效)。
    【解决方案4】:

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

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

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

    【讨论】:

    • 密码摘要受到保护,您可以通过这种方式绕过它。 User.new.send(:password_digest, 'password')
    • 但这会导致在某些情况下猜测用户密码,如何检查密码并仍然受益于设计节流保护?
    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2015-05-12
    相关资源
    最近更新 更多