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.