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来测试密码验证。我想确保带有空格的密码返回无效。这是我的代码,但是当我测试带有空格的密码(其余为八个或更多字符)时,规范仍未通过。
答案 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-security和devise_zxcvbn。