2011-05-19 84 views
1

在grails中,我可以設置密碼字段的最小大小限制爲5(任意)。問題是我使用彈簧安全服務來編碼我的密碼,編碼/加密的密碼遠遠長於5個字符,幾乎不管我輸入什麼值。驗證grails中的加密密碼

另一個論壇響應建議在save方法中進行驗證。有沒有人解決這個問題,並知道解決它的方法?

Spring安全不提供解碼方法(可能出於安全目的)...所以我想一個想法是獲得一個不同的密碼編碼器,可以解密密碼以進行驗證......但我的本能說春季安全離開了這一點,一個很好的理由,也許我應該這麼做......

static constraints = { 
    username(blank: false, unique: true) 
    password(minSize: 5, blank: false, unique: true, 
     validator: { passwd, user -> 
      return passwd != user.username 
    }) 
    passwordRepeat(nullable: false, 
    validator: { passwd2, user -> 
     return passwd2 == user.password 
    }) 
} 

所以我使用的是靜態的約束來驗證,因爲大多數其他變量驗證這種方式。

我很抱歉無法讀取評論。

謝謝 -Asaf

編輯:我認爲,一個簡單的解決方法是如上面提到的,這樣做的保存方法(加密前)的驗證,但我只是覺得有人的地方必須有應對與此前的問題。我的意思是,有那麼多需要密碼的網站,如果它太短,如果它不包含小寫和大寫字母,如果它沒有符號,就會對你大吼......如何做到各種各樣的他們使用的驗證方法?

+0

即時通訊不知道是什麼問題....你如何驗證密碼? – hvgotcodes 2011-05-19 19:10:12

+0

靜態約束= { \t \t用戶名(空白:假的,獨特的:真) \t \t密碼(minSize屬性:5,空白:假的,獨特的:真, \t \t \t驗證:{passwd中,用戶 - > \t \t \t \t return passwd!= user。用戶名 \t \t}) \t \t passwordRepeat(可空:假的, \t \t驗證:{passwd2,用戶 - > \t \t \t回passwd2 == user.password的\t \t \t}) \t} 所以我使用靜態約束來驗證,因爲大多數其他變量都以這種方式進行驗證。不幸的是,這個驗證只有在密碼被加密後才能完成。 – Asaf 2011-05-19 19:19:57

+0

這是在評論中無法閱讀,請編輯您的問題。 – hvgotcodes 2011-05-19 19:24:11

回答

1

您無法解碼Spring Security編碼的內容......這是md5或sha-256!這正是加密過程的目的。然後,即使數據庫文件被盜也無法知道密碼是什麼

要驗證密碼,您需要提示用戶輸入一個清楚的密碼(請以https發送),然後使用相同的密碼進行編碼算法。然後,您必須將其與您存儲的編碼密碼進行比較

使用類DigestUtils可以使用第一次使用的相同算法對接收到的密碼進行編碼。這是一個Spring Security的配置grails.plugins.springsecurity.password.algorithm

是的,你必須在保存前驗證......爲此,我們已經在引導加元類

String.metaClass.validateAsPassword 

有一個獨特之處從驗證我們之前的密碼保存他們

+1

完美答案。此外,您可以添加一些JavaScript驗證。 – rdmueller 2011-05-20 07:27:48

+0

@Ralf謝謝;-)你說得對,Javascript更友好,並且可以在發送給客戶端進行比較之前用於語法檢查密碼(長度,構圖)。也有支持雙重編碼(客戶端/服務器,2種不同的算法),甚至在https線路上。 – Grooveek 2011-05-20 07:33:59

+0

非常感謝您的好信息。 – Asaf 2011-05-26 12:52:15