使用自定义验证器

validation 包 允许你调用verifying 方法创建特殊的约束。但是, Play 还给你一个可选的创建自定义约束的方法,是使用Constraint 样例类。

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

val allNumbers = """\d*""".r
val allLetters = """[A-Za-z]*""".r

val passwordCheckConstraint: Constraint[String] = Constraint("constraints.passwordcheck")({
  plainText =>
    val errors = plainText match {
      case allNumbers() => Seq(ValidationError("Password is all numbers"))
      case allLetters() => Seq(ValidationError("Password is all letters"))
      case _ => Nil
    }
    if (errors.isEmpty) {
      Valid
    } else {
      Invalid(errors)
    }
})

注意: 这只是一个特意演示的例子。对于正确的密码安全设计请使用OWASP 指南

我们可以使用Constraints.min结合这个约束,来给密码添加额外的验证。

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