Cara memverifikasi kata sandi pengguna di Devise

96

Saya mengalami masalah saat mencocokkan kata sandi pengguna menggunakan permata devise di rel. Kata sandi pengguna disimpan di db saya yang merupakan encrypted_password dan saya mencoba mencari pengguna dengan kata sandi, tetapi saya tidak mengerti cara mencocokkan kata sandi dari formulir dan encrypted_password di db saya.

User.find_by_email_and_password(params[:user][:email], params[:user][:password])
poporul
sumber
3
Saya pikir jawaban yang benar telah ditawarkan. Bisakah kamu memilihnya?
Brendon Muir

Jawaban:

269

Saya pikir ini adalah cara yang lebih baik, dan lebih elegan untuk melakukannya:

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

Metode lain tempat Anda membuat intisari dari instance pengguna memberi saya kesalahan metode terlindungi.

joshaidan
sumber
2
intisari kata sandi dilindungi, Anda dapat menyiasatinya dengan cara ini. User.new.send (: password_digest, 'password')
Mark Swardstrom
tetapi ini akan mengarah pada menebak kata sandi pengguna dalam beberapa konteks, bagaimana cara memeriksa kata sandi dan masih mendapat manfaat dari merancang perlindungan pelambatan?
simo
19

Gunakan Metode Rancangan

Devise memberi Anda metode built-in untuk memverifikasi kata sandi pengguna :

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

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

Untuk Rails 4+ dengan Params Kuat , Anda dapat melakukan sesuatu seperti ini:

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
Sheharyar
sumber
Bekerja untuk proyek saya. Terima kasih.
zmd94
6

Saya pikir yang lebih baik adalah ini

valid_password = User.find_by_email(params[:user][:email]).valid_password?(params[:user][:password])
Amrit Dhungana
sumber
4
Itu akan mengatur pengguna ke nilai boolean (apakah kata sandi itu valid atau tidak).
Ryan Taylor
0

Saya akan menyarankan ini.

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