Як перевірити пароль користувача в Devise


96

У мене виникла проблема з узгодженням пароля користувача з використанням пристрою gem in rails. Пароль користувача, який зберігається на моїй базі даних, яка є encrypted_password, і я намагаюся знайти користувача за паролем, але я не розумію, як зрівняти пароль із форми та encrypted_password у моїй базі даних.

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

3
Думаю, було запропоновано правильну відповідь. Ви можете вибрати його?
Brendon Muir

Відповіді:


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])

Для 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

6

Я думаю, що кращим буде це

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

4
Це встановить для користувача логічне значення (чи дійсний пароль чи ні).
Райан Тейлор,

0

Я б запропонував це.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.