使用正则表达式验证Rails密码中的空白

时间:2018-08-17 23:55:46

标签: ruby-on-rails

class User < ApplicationRecord
  PASSWORD_FORMAT = /\A
    (?=.*[^\\s-])       # Must not have any blank spaces
    (?=.{8,})           # Must contain 8 or more characters
    (?=.*[A-Z])         # Must contain an upper case character
    (?=.*[[:^alnum:]])  # Must contain a symbol
  /x

  validates :password_digest, presence: true, format: { with: PASSWORD_FORMAT }
  validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
  validates :first_name, presence: true
  validates :last_name, presence: true

  has_many :companies
end

我正在尝试通过一个rspec来测试密码验证。我想确保带有空格的密码返回无效。这是我的代码,但是当我测试带有空格的密码(其余为八个或更多字符)时,规范仍未通过。

1 个答案:

答案 0 :(得分:1)

您几乎拥有它。您需要的是对空格的否定提前。 (?!.*\s)

PASSWORD_FORMAT = /\A
  (?!.*\s)            # Must not have any blank spaces
  (?=.{8,})           # Must contain 8 or more characters
  (?=.*[A-Z])         # Must contain an upper case character
  (?=.*[[:^alnum:]])  # Must contain a symbol
/x

从密码中排除空格很奇怪。如果有人真的想要,那应该没有错。减少可能的字符数会减少可能的密码(也称为"entropy"),从而可能使其变得更弱。最后,像这样的复杂密码规则可能会使使用密码生成器的人感到沮丧,而密码生成器并不总是被调整为遵循所有规则。

相反,将安全问题留给专家。而不是滚动您自己的密码强度检查器,而是已经有任何数字了。这也节省了开发时间,调试和维护。

strong_password(基于熵)和password_strength(基于规则)。两者都提供ActiveRecord验证。如果您使用的是Devise devise-securitydevise_zxcvbn