Devise'da bir kullanıcının parolası nasıl doğrulanır?


97

Devise gem in rails kullanarak kullanıcı şifresini eşleştirmede sorun yaşıyorum. Şifrelenmiş_parola olan veritabanımda depolanan kullanıcı parolası ve parolayla kullanıcıyı bulmaya çalışıyorum, ancak veritabanımdaki form ve encrypted_password'deki parolayı nasıl eşleştireceğimi anlamıyorum.

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

3
Doğru cevabın sunulduğunu düşünüyorum. Onu seçebilir misin?
— Brendon Muir

Yanıtlar:


270

Bunun daha iyi ve daha zarif bir yol olduğunu düşünüyorum:

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

Kullanıcı örneğinden özet oluşturduğunuz diğer yöntem, bana korumalı yöntem hataları veriyordu.


2
şifre özeti korumalıdır, bu şekilde aşabilirsiniz. User.new.send (: password_digest, 'password')
— Mark Swardstrom

ancak bu, bir bağlamda kullanıcı şifresinin tahmin edilmesine, şifre nasıl kontrol edilmesine ve yine de kısıtlama korumasından nasıl yararlanılacağına yol açar?
— simo

21

Yöntemleri Kullanın

Devise, bir kullanıcının şifresini doğrulamak için size yerleşik yöntemler sağlar :

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

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

İçin Güçlü parametreleri içeren Raylar 4+ , böyle bir şey yapabilirsiniz:

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

Projem için çalışıyor. Teşekkürler.
— zmd94

6

Bence daha iyisi bu olacak

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

4
Bu, kullanıcıyı bir boole değerine ayarlar (parolanın geçerli olup olmadığı).
— Ryan Taylor

0

Bunu öneririm.

user = User.where("email=? OR username=?", email_or_username, email_or_username).first.valid_password?(user_password)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.