Devise에서 사용자의 비밀번호를 확인하는 방법


96

레일에서 devise gem을 사용하여 사용자 비밀번호를 일치시키는 데 문제가 있습니다. 사용자 암호는 encrypted_password이고 암호로 사용자를 찾으려고하는데 db의 암호와 암호를 일치시키는 방법을 이해하지 못합니다.

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

3
정답이 제시된 것 같습니다. 선택할 수 있습니까?
Brendon Muir 2013

답변:


269

나는 이것이 더 좋고 우아한 방법이라고 생각합니다.

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

사용자 인스턴스에서 다이제스트를 생성하는 다른 방법은 보호 된 메서드 오류를 제공하는 것입니다.


2
암호 다이제스트는 보호되어 있으므로이 방법으로 해결할 수 있습니다. User.new.send (: password_digest, '비밀번호')
마크 Swardstrom

그러나 이것은 어떤 맥락에서 사용자 암호를 추측하고 암호를 확인하는 방법과 여전히 스로틀 링 보호를 고안하는 방법으로 이어질 수 있습니까?
simo

19

Devise 방법 사용

Devise는 사용자의 암호를 확인하는 기본 제공 방법을 제공 합니다 .

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

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

들어 강력한에 Params와 레일 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

6

이거 더 좋을 것 같아요

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

4
그러면 사용자가 부울 값으로 설정됩니다 (암호가 유효한지 여부).
Ryan Taylor

0

나는 이것을 제안 할 것이다.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.