【问题标题】:Regex validation with @Pattern annotation in spring data在 Spring 数据中使用 @Pattern 注释进行正则表达式验证
【发布时间】:2018-07-25 11:47:35
【问题描述】:

我需要密码验证(例如密码必须包含至少 4 个字符,最多 8 个和最少 1 个数字)。 我有模型(当然有 getter 和 setter):

   @Entity
public class User implements Serializable{


    /**
     * 
     */
    private static final long serialVersionUID = 5534441879591858724L;

    @Id
    @GeneratedValue
    private long id;

    @NotBlank
    @Email
    private String email;

    @Pattern(regexp = "^(?=.*\\d).{4,8}$", flags = Flag.UNICODE_CASE)
    private String password;

    @NotBlank
    @Size(min=2, max=30)
    private String name;

我在将用户信息保存到数据库期间捕获了 ConstraintViolationException,并使用此异常中的信息在注册期间通知用户由于长度无效等原因必须更正哪些字段。

验证一切正常,但没有密码。我从这个模型类中检查了正则表达式,它工作正常,但是当我把这个正则表达式放入注释参数(@Pattern(regexp = "^(?=.*\\d).{4,8}$", flags = Flag.UNICODE_CASE))时它不起作用,我有一个错误:

HHH000346:托管刷新期间出错 [类验证失败 [pl.rpf.kingdom.models.User] 在组的持续时间内 [javax.validation.groups.Default, ] 约束违规列表:[ ConstraintViolationImpl{interpolatedMessage='必须匹配"^(?=.*\d).{4,8}$"', propertyPath=password, rootBeanClass=class pl.rpf.kingdom.models.User, messageTemplate='{javax.validation.constraints.Pattern.message}'} ]]

请帮助我理解这个错误,也许你知道如何解决这个问题。

【问题讨论】:

  • 阅读Reference - Password Validation,您可能会受益。我不确定您为什么将密码限制在 4 到 8 个字符之间...
  • 哪个密码未通过检查?
  • 好的。这只是一个例子,正则表达式现在不那么重要了。如果它适用于一个正确的正则表达式,我会找到更好的正则表达式以获得更强的密码;)
  • 实际上 p.ex pass123 也不起作用(它至少有 4 个,最多 8 个字符,一个数字)。但是我用普通的matches()方法在其他类中测试了它,没关系。只有我的注释不起作用。

标签: java regex spring-data constraints


【解决方案1】:

问题在于密码加密,我忘记了。 正则表达式匹配方法总是错误的,因为它试图在加密后比较密码。 我通过在密码加密之前将验证排除在模型类之外来解决问题。 解决问题的其他方法可能是在尝试将表单保存到数据库之前使用 spring @Valid 注释来验证表单(在我的情况下,其他情况可能会出现问题)。

【讨论】:

  • 密码应该是散列而不是加密。
猜你喜欢
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
相关资源
最近更新 更多