Hibernate验证程序REGEX模式不起作用

kse8i1jr  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在使用hib验证来验证从Quarkus REST API中的请求接收到的实体。我正在尝试通过使用User实体的 * password * 字段的@Pattern注解来添加快速简单的密码验证以创建用户。

@Entity
@Table(name = "users")
public class User extends BaseEntity {
    public static final int MIN_PASSWORD_LENGTH = 8;
    public static final int MAX_PASSWORD_LENGTH = 20;
    public static final String PASSWORD_PATTERN = 
        "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,20}$";
    
    // other fields...

    @Length(min = MIN_PASSWORD_LENGTH, max = MAX_PASSWORD_LENGTH)
    @NotBlank(message = "The password field cannot be empty or blank.")
    @Pattern(regexp = PASSWORD_PATTERN, message = "The given password does not match the rules.")
    @Column(name = "password", length = 256, nullable = false)
    private String password;

    //get/set...
}

所以我使用的REGEX模式是:

^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,20}$

这显然对应于:

  • 至少一位数字
  • 至少一个小写字符
  • 至少一个大写字符
  • 至少有一个特殊字符(!@#&()-[{}]:;',?/*~$^+=〈〉)
  • 长度介于8到20个字符之间

这在https://regex101.com/ for Java REGEX引擎上运行良好,测试密码如下:
什么?

然而,hibvalidator在我的端点中抛出了一个错误,因为它显然不匹配给定的模式。为什么hibvalidator不能正确匹配密码?
(由休眠约束违规异常触发的解析响应):

{
  "title": "Constraint Violation",
  "status": 400,
  "violations": [
    {
      "field": "password",
      "message": "The given password does not match the rules."
    }
  ]
}
juzqafwq

juzqafwq1#

我的坏家伙们,我发现了这个问题。这不是Hibernate验证器故障。异常是在实体被持久化时引起的,而不是在REST端点之前解析和评估它时。我在将其持久化到端点之前更改了密码字段内容,新值与REGEX不匹配。
我不知道带注解的Hibernate验证也会在持久化之前执行(使用entityManager.persist()),我只是把它看作是解析过程中发生的事情,出于某种奇怪的原因,所以这是我的错。
感谢@mark_o无论如何都能抽出时间!

相关问题