วิธีตรวจสอบรหัสผ่านของผู้ใช้ใน Devise


97

ฉันมีปัญหาในการจับคู่รหัสผ่านผู้ใช้โดยใช้อัญมณีประดิษฐ์ในราง รหัสผ่านผู้ใช้ที่เก็บไว้ในฐานข้อมูลของฉันซึ่งเป็นรหัสผ่านที่เข้ารหัสและฉันพยายามค้นหาผู้ใช้ด้วยรหัสผ่าน แต่ฉันไม่เข้าใจวิธีจับคู่รหัสผ่านจากแบบฟอร์มและรหัสผ่านรหัสผ่านในฐานข้อมูลของฉัน

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

3
ฉันคิดว่ามีการเสนอคำตอบที่ถูกต้องแล้ว คุณสามารถเลือกได้หรือไม่?
Brendon Muir

คำตอบ:


270

ฉันคิดว่านี่เป็นวิธีที่ดีกว่าและสวยงามกว่าในการทำ:

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

วิธีอื่นที่คุณสร้างไดเจสต์จากอินสแตนซ์ผู้ใช้ทำให้ฉันมีข้อผิดพลาดวิธีการป้องกัน


2
รหัสผ่านได้รับการป้องกันคุณสามารถหลีกเลี่ยงได้ด้วยวิธีนี้ User.new.send (: password_digest, 'password')
Mark Swardstrom

แต่สิ่งนี้จะนำไปสู่การเดารหัสผ่านของผู้ใช้ในบางบริบทวิธีตรวจสอบรหัสผ่านและยังคงได้รับประโยชน์จากการป้องกันการควบคุมปริมาณ
simo

21

ใช้ Devise Methods

Devise มีวิธีการในตัวเพื่อยืนยันรหัสผ่านของผู้ใช้ :

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

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

สำหรับRails 4+ ที่มี Strong Paramsคุณสามารถทำสิ่งนี้ได้:

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.