2012-02-23 60 views
1

我使用@Pattern正则表达式验证用户密码。屏幕验证,JPA验证和散列密码

这工作正常,但然后我散列密码,这导致密码超过我验证指定的16个字符。

但是,这个验证规则过滤到我的JPA层,所以我的哈希密码太长了验证规则,并且当我试图保留我的对象时,我得到'Validation failed for ....'消息。

当然,我错过了一些基本的东西,但它是什么?

感谢

+0

基本上,我只想验证发生在表示层,忘记说了。如何在持久层关闭它? – Richard 2012-02-23 23:03:27

+0

只需注意:如果需要,您可以编辑您的问题。只需按下标签下的“编辑”链接即可。 – mc10 2012-02-23 23:07:24

+0

另外:为什么你想要在密码上的最大长度?任何对密码内容的限制都会让知道熵是如何工作的人感到困扰。 – millimoose 2012-02-23 23:11:04

回答

0

这是一个典型的场景,以及解决方案有两个:

  • 使用的DTO - 不在PA实体和用于将数据从网络层转移到业务层的对象。因此,您只将正则表达式验证放在DTO上,而不是实体
  • 有一个@Transient字段repeatPassword并将验证放置在那里,而不是在数据库中持久化的验证。

总之 - 你不应该在实体的实际密码字段上注释。关闭持久层的验证是一种选择,但不是首选,因为它可能会导致很多副作用。

+0

啊,谢谢,这是有道理的。我使用Roo生成所有实体类,所以希望避免DTO。我有一个瞬态字段('confirmPassword'),所以我会坚持验证那里。将尽快报告 - 谢谢百万 – Richard 2012-02-23 23:06:32

+0

是的,谢谢你,有点疯了。也很完美。干杯! – Richard 2012-02-23 23:14:44

+0

为了澄清,我有一个密码字段作为纯文本从表单传递过来。然后我把它散列,导致一个很长的字符串。该字段没有验证。我的实体(也来自表单)上也有一个'confirmPassword'字段,但我不坚持它,所以它的标记为瞬态。这是我有@Pattern验证的字段。效果很好。 – Richard 2012-02-23 23:16:59