javascript
使用Spring Security 5进行密码编码器迁移
最近,我在一個使用自定義PasswordEncoder的項目中工作,需要將其遷移到bcrypt 。 當前的密碼存儲為hash ,這意味著不可能將其還原為原始的String –至少不是簡單的方法。
這里的挑戰(zhàn)是如何支持兩種實現,舊的哈希解決方案以及新的bcrypt實現。 經過一些研究,我可以找到Spring Security 5的 DelegatingPasswordEncoder 。
認識DelegatingPasswordEncoder
DelegatingPasswordEncoder類可以支持基于前綴的多個password encoders 。 密碼存儲如下:
{bcrypt}$2a$10$vCXMWCn7fDZWOcLnIEhmK.74dvK1Eh8ae2WrWlhr2ETPLoxQctN4. {noop}plaintextpasswordSpring Security 5帶來了方便的PasswordEncoderFactories類,當前該類支持以下編碼器:
public static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());return new DelegatingPasswordEncoder(encodingId, encoders); }現在,無需聲明單個PasswordEncoder我們可以使用PasswordEncoderFactories ,例如以下代碼片段:
@Bean public PasswordEncoder passwordEncoder() {return PasswordEncoderFactories.createDelegatingPasswordEncoder(); }添加自定義編碼器
現在,回到我最初的問題,由于遺留原因,有一個本地的password encoding解決方案,并且方便使用的PasswordEncoderFactories對它一無所知,以解決我已經創(chuàng)建了一個類似于PasswordEncoderFactories的類并添加了所有已構建的類的問題。 -in編碼器和我的自定義編碼器,這是一個示例實現:
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.DelegatingPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder; import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;import java.util.HashMap; import java.util.Map;class DefaultPasswordEncoderFactories {@SuppressWarnings("deprecation")static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());encoders.put("custom", new CustomPasswordEncoder());return new DelegatingPasswordEncoder(encodingId, encoders);} }然后,我使用DefaultPasswordEncoderFactories聲明了@Bean 。
第一次運行后,我意識到另一個問題,我將必須運行一個SQL腳本來更新所有現有的密碼,并添加{custom}前綴,以便框架可以正確地將前綴與正確的PasswordEncoder綁定,不要誤解我的意思。很好的解決方案,但是我真的不想弄亂數據庫中的現有密碼,幸運的是, DelegatingPasswordEncoder類允許我們設置默認的 PasswordEncoder ,這意味著只要框架嘗試在存儲的密碼中找不到前綴,它都會退回default以嘗試對其進行解碼。
然后,我將實現更改為以下內容:
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.DelegatingPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder; import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;import java.util.HashMap; import java.util.Map;class DefaultPasswordEncoderFactories {@SuppressWarnings("deprecation")static PasswordEncoder createDelegatingPasswordEncoder() {String encodingId = "bcrypt";Map<String, PasswordEncoder> encoders = new HashMap<>();encoders.put(encodingId, new BCryptPasswordEncoder());encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());encoders.put("scrypt", new SCryptPasswordEncoder());encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));DelegatingPasswordEncoder delegatingPasswordEncoder = new DelegatingPasswordEncoder(encodingId, encoders);delegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(new CustomPasswordEncoder());return delegatingPasswordEncoder;}}@Bean聲明現在是:
@Bean public PasswordEncoder passwordEncoder() {return DefaultPasswordEncoderFactories.createDelegatingPasswordEncoder(); }結論
遷移密碼編碼器是一個現實生活中的問題, Spring Security 5通過一次支持多個PasswordEncoder提供了一種便捷的方式來輕松處理它。
腳注
- 本教程使用的代碼可以在GitHub上找到 。
- DelegatingPasswordEncoder – Spring Docs
翻譯自: https://www.javacodegeeks.com/2019/03/password-encoder-migration-spring-security-5.html
總結
以上是生活随笔為你收集整理的使用Spring Security 5进行密码编码器迁移的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人偶怎么做 如何自己做人偶玩具
- 下一篇: gbp是什么 gbp的意思