Cách xác minh mật khẩu của người dùng trong Devise


96

Tôi đang gặp sự cố khi khớp mật khẩu của người dùng bằng cách sử dụng devise gem in rails. Mật khẩu người dùng được lưu trữ trên db của tôi là mật khẩu mã hóa và tôi đang cố gắng tìm người dùng bằng mật khẩu, nhưng tôi không hiểu cách đối sánh mật khẩu từ biểu mẫu và mật khẩu được mã hóa trong db của mình.

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

3
Tôi nghĩ rằng câu trả lời chính xác đã được đưa ra. Bạn có thể chọn nó?
Brendon Muir

Câu trả lời:


269

Tôi nghĩ rằng đây là một cách tốt hơn và thanh lịch hơn để làm điều đó:

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

Phương pháp khác mà bạn tạo thông báo từ cá thể người dùng đã cho tôi lỗi phương pháp được bảo vệ.


2
thông báo mật khẩu được bảo vệ, bạn có thể vượt qua nó theo cách này. User.new.send (: password_digest, 'password')
Mark Swardstrom 27/10/13

nhưng điều này sẽ dẫn đến việc đoán mật khẩu của người dùng trong một số ngữ cảnh, làm thế nào để kiểm tra mật khẩu mà vẫn được lợi từ việc thiết lập biện pháp bảo vệ điều tiết?
simo

19

Sử dụng phương pháp Devise

Devise cung cấp cho bạn các phương pháp tích hợp để xác minh mật khẩu của người dùng :

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

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

Đối với Rails 4+ với Strong Params , bạn có thể làm như sau:

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

Hoạt động cho dự án của tôi. Cảm ơn.
zmd94

6

Tôi nghĩ cái tốt hơn sẽ là cái này

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

4
Điều đó sẽ đặt người dùng thành một giá trị boolean (cho dù mật khẩu có hợp lệ hay không).
Ryan Taylor

0

Tôi sẽ đề nghị điều này.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.