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 项目中找到源代码.
来源: https://www.cnblogs.com/xjknight/p/10929291.html