如何在Devise中验证用户密码


96

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

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

3
我认为提供了正确的答案。你可以选择吗?
Brendon Muir

Answers:


269

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

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

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


2
密码摘要受保护,您可以通过这种方式解决它。User.new.send(:password_digest,'password')
Mark Swardstrom

但这会导致在某些情况下猜测用户密码,如何检查密码并仍然受益于设计节流保护?
simo

19

使用设计方法

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

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

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

对于具有Strong 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

适用于我的项目。谢谢。
zmd94


0

我建议这个。

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.