在Spring Security 5中如何使用默认的Password Encoder
作者: baeldung
译者: helloworldtang
1. 概览
在Spring Security 4中,可以使用in-memory认证模式直接将密码以纯文本的形式存储。
在Spring Security 5中,密码管理机制进行了一次大的修改,默认引入了更安全的加/解密机制。这意味着,如果您的Spring应用程序使用纯文本的方式存储密码,升级到Spring Security 5后可能会出现问题。
在这个简短的教程中,我们将描述其中一个潜在的问题,并演示如何解决。
2. Spring Security 4
我们将给出一个常规的安全配置,它使用了简单的in-memory认证模式(适用于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();
}
}
这个配置定义了所有映射到/private/的方法都需要身份认证,并且所有映射到/public/的方法都不需要身份认证。
如果我们在Spring Security 5使用相同的配置,将会报错:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
这个错误告诉我们,给定的密码 不能被解码,这是因为我们的in-memory认证模式没有配置Password Encoder 。
3. Spring Security 5
我们可以通过使用PasswordEncoderFactories类创建一个DelegatingPasswordEncoder的方式来解决这个问题。
我们使用这个Password Encoder来配置我们的用户信息:
@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 Password Encoder。内存中存储密码的格式如下所示:
{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
虽然我们可以实现自定义的Password Encoder,但建议使用PasswordEncoderFactories类提供的默认编码器。
3.1. 迁移现有的密码
我们可以通过以下方式将现有密码升级到推荐的Spring Security 5标准:
- 用BCryptPasswordEncoder加密后的密码更新老密码:
String encoded = new BCryptPasswordEncoder().encode(plainTextPassword);
- 在加密后的密码前添加Password Encoder各自的标识符
{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
- 当存储密码的Password Encoder未知时,提示用户更新他们的密码
4. 总结
在这个简短的例子中,我们使用新的密码存储机制将一个Spring 4下的,使用了in-memory 认证模式的配置升级到了Spring 5。
与往常一样,您可以在GitHub上查看源代码。
相关文章
- Spring学习笔记(二十五)——springboot定时任务和Gson、Date、进制等工具的使用
- Spring MVC框架:第四章:属性域使用(request域、session域、application域)
- Spring MVC框架学习(二)---- 使用原生的配置 熟悉 SpringMVC 的执行流程
- Spring Data Mongodb多表关联查询
- Spring与SpringBoot整合Spring Data JPA及使用
- spring boot整合shiro_Spring框架介绍及使用
- 为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解
- springboot配置多个yml_spring几种配置方式
- Spring中使用模板方法模式(接上文)
- 云原生之快速使用Nacos Spring Cloud
- spring cache注意事项
- Spring Boot整合MyBatis(保姆级教程)
- Java框架Spring入门-第一个spring项目
- spring 整合 redis,以及spring的RedisTemplate如何使用
- 使用GraalVM 构建 Spring Boot 3.0 原生可执行文件
- Spring 6.0 重磅发布!最低支持 Java 17 !!
- Spring Cloud Security配置OAuth2客户端来访问受保护的API
- Spring Cloud Security使用OAuth2授权服务器来保护API
- Spring Cloud Bus使用自定义的消息转换器(三)
- Spring JDK动态代理
- spring事务(Transaction)的七种事务传播行为及五种隔离级别详解数据库
- 如何使用drools和Spring整合详解编程语言
- 对照项目(struts2、mybatis、spring),整理如何使用jxls导入excel数据详解编程语言
- Spring Boot全局支持CORS(跨源请求)的配置方法详解编程语言
- Spring Boot实现热部署详解编程语言
- Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控详解编程语言
- spring Boot(十九):使用Spring Boot Actuator监控应用详解编程语言
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例详解编程语言
- Spring Boot(四):thymeleaf使用详解编程语言
- 基于注解的Spring AOP的配置和使用详解编程语言
- Spring框架下整合Redis的实现(spring整合redis)
- Spring整合Redis简单实现高效缓存(spring集成redis)