1

Rails は保存中にエラーをクリアするため、私のモデルではこれを行うことができません。

  def password= plain_text
    if plain_text =~ /\d/ && plain_text =~ /\w/
      self.password_digest = BCrypt::Password.create(plain_text)
    else
      self.errors[:password] = "must contain one digit and one word character."
    end
  end

bcryptを使用しながら、レールで1文字と1桁のパスワードを検証する最良の方法は何ですか?

4

1 に答える 1

2

has_secure_passwordRailsオプションを使用している場合は、 Rails がpassword=メソッドを処理します。パスワードを設定すると、 Rails は暗号化されていないパスワードをインスタンス変数に保持します@password

def password=(unencrypted_password)
  ...
  @password = unencrypted_password
  cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
  self.password_digest = BCrypt::Password.create(unencrypted_password, cost: cost)

値は@password、レコードがデータベースに保存されるまでメモリに残ります。したがって、に対して検証を実行できますpassword。検証に合格すると、暗号化されたpassword_digest値が保存されます。

これは、パスワードが許可されている最大のパスワードよりも長くないことを検証するときに Rails が行うことであることがわかります。

validates_length_of :password, maximum: ActiveModel::SecurePassword::MAX_PASSWORD_LENGTH_ALLOWED
于 2020-01-02T14:18:45.163 に答える