2013-07-21 4 views
1

Когда я вхожу в систему с именем пользователя и паролем с помощью BCrypt, никаких проблем нет, все в порядке.Обновление пароля с помощью BCrypt

Но когда я перехожу к процессу восстановления пароля и пытаюсь войти в систему с новым паролем, BCrypt никогда не вернет true.

код у меня выглядит следующим образом:

before_save :encrypt_password 
before_update :encrypt_password 

def authenticate 
    player = Player.find_by(mail: self.mail) 
    unless player.nil? 
    current_password = BCrypt::Password.new(player.password) 
    if current_password == self.password 
    player 
    else 
    nil 
    end 
end 
end 

private 
def encrypt_password 
    unless self.password.nil? 
    self.password = BCrypt::Password.create(self.password) 
end 

Я использую рельсы 4

ответ

3

Вам не нужно before_update обратного вызова.

При создании новой записи (пользователь в этом случае) запускается только before_save. Таким образом, вы получаете правильное поведение.

Но при обновлении записи запускаются как before_update, так и before_save, что означает, что ваш столбец password зашифрован дважды. Вот почему вы получаете неожиданное поведение.

Для получения дополнительной информации о обратных вызовах отметьте this page.


Более того, я думаю, что это плохая идея, чтобы сделать password реальный столбец в базе данных. Все, что вам нужно, это столбец с именем encrypted_password в базе данных и создание password виртуального атрибута.

Таким образом, вы можете написать encrypt_password метод, как это:

def encrypt_password 
    unless self.password.nil? 
    self.encrypt_password = BCrypt::Password.create(self.password) 
end 

Который не дал вам никаких шансов сделать ошибку, как вы только что сделали.

+0

Да, сейчас он работает! Большое спасибо, что я только начинаю в Rails – aperez

+0

Хорошо! Я понял! thnk снова! – aperez

 Смежные вопросы

  • Нет связанных вопросов^_^