2012-02-23 59 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