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

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.


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

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

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.