轉載請註明出處 http://www.cnblogs.com/majianming/p/7923604.htmlhtml
最近在學習spring security,可是在設置客戶端密碼時,一直出現了一下錯誤提示,原來沒有問題的,認真上次到如今這之間的時間動了什麼,我想到了我把 spring security 升級到了5.0.0,應該是這裏的問題,那麼總須要解決,回退也不是方法吧spring
仔細查找資料,發現了一下兩篇資料,實際上是同樣的意思數據庫
https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-storage-updatedapi
這個是原文app
Password storage has undergone a major overhaul to provide more secure defaults and the ability to migrate how passwords are stored. The default
PasswordEncoder
is now DelegatingPasswordEncoder which is a non-passive change. This change ensures that passwords are now encoded using BCrypt by default, allows for validating passwords in old formats, and allows for upgrading the password storage in the future.ide
我簡單理解了一下,意思就是爲了更加安全,因此就須要添加這個類型(id)函數
若是沒有加密的時候(也便是明文保存),須要改成這樣,假設明文密碼是passwordoop
password -> {noop}password // noop是no operate的意思,也就是說明保存的密碼沒有作加密操做
總的來講就是在spring security 4的密碼格式上添加了密碼類型的標記,並將這個標記使用花括號包裹放在密碼密文的前面,造成spring security 5 的密碼格式學習
加密類型支持(爲了方便書寫,這裏假設各種加密方式加密後的密碼密文是password)
加密方式 | 原來security 4的密碼格式 | 如今security 5的密碼格式 |
bcrypt | password | {bcrypt}password |
ldap | password | {ldap}password |
MD4 | password | {MD4}password |
MD5 | password | {MD5}password |
noop | password | {noop}password |
pbkdf2 | password | {pbkdf2}password |
scrypt | password | {scrypt}password |
SHA-1 | password | {SHA-1}password |
SHA-256 | password | {SHA-256}password |
sha256 | password | {sha256}password |
接下來介紹一下分析。若是咱們不添加這個類型會怎麼樣,咱們查看 org.springframework.security.crypto.password.DelegatingPasswordEncoder 這個類,在裏面一個內部類UnmappedIdPasswordEncoder的matches方法拋出了一個異常信息There is no PasswordEncoder mapped for the id \"" + id + "\"",這不就是咱們拋出的異常嗎?
繼續看看代碼,在DelegatingPasswordEncoder初始化成員變量時候 ,有這樣的定義
private PasswordEncoder defaultPasswordEncoderForMatches = new UnmappedIdPasswordEncoder();
也就是說這裏將UnmappedIdPasswordEncoder()設置爲了默認,在matches函數中
String id = extractId(prefixEncodedPassword); PasswordEncoder delegate = this.idToPasswordEncoder.get(id);
if(delegate == null) {
return this.defaultPasswordEncoderForMatches
.matches(rawPassword, prefixEncodedPassword);
}
這裏,調用了默認的matches函數,也就是UnmappedIdPasswordEncoder的matches,若是設置在數據庫密碼沒有帶{}這樣的標記,或者標記裏的encode id 沒有在聲明的id 集合內(id集合是什麼?也就是上面表格中所支持的加密格式,在運行時候DelegatingPasswordEncoder的構造函數打個斷點就知道了,其實就是idToPasswordEncoder這個變量的值,這個值定義PasswordEncoderFactories類中),那麼它就拋出異常。
String prefixEncodedPassword) { String id = extractId(prefixEncodedPassword); throw new IllegalArgumentException("There is no PasswordEncoder mapped for the id \"" + id + "\"");
轉載請註明出處 http://www.cnblogs.com/majianming/p/7923604.html
使用版本:spring security 5.0.0.RELEASE