Custom Validations

验证包 允许你调用 verifying 方法来创建专门的约束。Play 还提供了用 Constraint 样本类的方法来自定义约束。

这里,我们会实现一个简单的密码强度约束,通过正则表达式来验证密码不是由全字母或是全数字组成。Constraint 接受一个返回 ValidationResult 的函数,我们使用这个函数来返回密码验证的结果:

  1. val allNumbers = """\d*""".r
  2. val allLetters = """[A-Za-z]*""".r
  3. val passwordCheckConstraint: Constraint[String] = Constraint("constraints.passwordcheck")({
  4. plainText =>
  5. val errors = plainText match {
  6. case allNumbers() => Seq(ValidationError("Password is all numbers"))
  7. case allLetters() => Seq(ValidationError("Password is all letters"))
  8. case _ => Nil
  9. }
  10. if (errors.isEmpty) {
  11. Valid
  12. } else {
  13. Invalid(errors)
  14. }
  15. })

注意: 这个例子是为了演示自定义约束而故意设计的。关于正确的密码安全设计,请参考 OWASP 指南

我们还可以结合 Constraints.min 来给密码添加额外的一层验证、

  1. val passwordCheck: Mapping[String] = nonEmptyText(minLength = 10)
  2. .verifying(passwordCheckConstraint)