1

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を使用しています

4

1 に答える 1

3

コールバックは必要ありませんbefore_update

新しいレコード (この場合はユーザー) を作成すると、のみbefore_saveがトリガーされます。したがって、正しい動作が得られます。

ただし、レコードを更新すると、before_updateとの両方before_saveがトリガーされます。つまり、password列が 2 回暗号化されます。そのため、予期しない動作が発生します。

コールバックの詳細については、このページを確認してください。


passwordさらに、データベースに実際の列を作成するのは悪い考えだと思います。必要なのは、encrypted_passwordデータベースで呼び出されpassword、仮想属性を作成する列だけです。

encrypt_passwordしたがって、次のようにメソッドを記述できます。

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

これにより、今犯したような間違いを犯す機会がありませんでした。

于 2013-07-21T15:44:21.693 に答える