Spring Security 5中的默認密碼編碼器


1.概述

在Spring Security 4中,可以使用內存中身份驗證以純文本格式存儲密碼。

對版本5中的密碼管理過程進行了重大改進,為密碼編碼和解碼引入了更安全的默認機制。這意味着如果您的Spring應用程序以純文本格式存儲密碼,升級到Spring Security 5可能會導致問題

在這個簡短的教程中,我們將描述其中一個潛在的問題,並展示該問題的解決方案。

2. Spring Security 4

我們首先展示一個標准的安全配置,它提供簡單的內存中身份驗證(適用於Spring 4):

@Configuration
public class InMemoryAuthWebSecurityConfigurer 
  extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception {
        auth.inMemoryAuthentication()
          .withUser("spring")
          .password("secret")
          .roles("USER");
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/private/**")
          .authenticated()
          .antMatchers("/public/**")
          .permitAll()
          .and()
          .httpBasic();
    }
}

此配置定義所有/私有/映射方法的身份驗證以及/ public /下所有內容的公共訪問。

如果我們在Spring Security 5下使用相同的配置,我們會收到以下錯誤:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

該錯誤告訴我們由於沒有為我們的內存中身份驗證配置密碼編碼器,因此無法解碼給定的密碼

3. Spring Security 5

我們可以通過使用PasswordEncoderFactories類定義DelegatingPasswordEncoder來解決此錯誤。

我們使用此編碼器通過AuthenticationManagerBuilder配置我們的用戶:

@Configuration
public class InMemoryAuthWebSecurityConfigurer 
  extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        auth.inMemoryAuthentication()
          .withUser("spring")
          .password(encoder.encode("secret"))
          .roles("USER");
    }
}

現在,通過這種配置,我們使用BCrypt以以下格式存儲我們的內存中密碼:

{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS

雖然我們可以定義自己的一組密碼編碼器,但建議堅持使用PasswordEncoderFactories中提供的默認編碼器

3.1.遷移現有密碼

我們可以通過以下方式將現有密碼更新為推薦的Spring Security 5標准:

更新純文本存儲密碼及其編碼值:

String encoded = new BCryptPasswordEncoder().encode(plainTextPassword);

前綴散列存儲的密碼及其已知的編碼器標識符:

{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0

當存儲密碼的編碼機制未知時,請求用戶更新其密碼

4.結論

在這個快速示例中,我們使用新的密碼存儲機制將有效的Spring 4內存中認證配置更新到Spring 5

與往常一樣,您可以在GitHub項目中找到源代


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM