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项目中找到源代

最新文章

  1. Spark——共享变量
  2. Python第一天 - list\字符串截取
  3. centos7+redis+php环境配置
  4. EMC Documentum DQL整理(一)
  5. SpringMVC的Controller中使用线程安全的初始化
  6. syslog syslog-ng rsyslog flume scribe 各种尝试
  7. 从linux内核代码分析操作系统启动过程
  8. 单片机C语言下LCD多级菜单的一种实现方法
  9. 自己动手学TCP/IP–http协议(http报文头)
  10. perl lwp 默认的请求头
  11. java.lang.RuntimeException: Method called after release()
  12. 房费制 之 登录BUG
  13. Android数据库高手秘籍(六)——LitePal的改动和删除操作
  14. 日常API之图灵聊天机器人
  15. Css Secret 案例Demo全套
  16. Java:并发不易,先学会用
  17. Two kinds of item classification model architecture
  18. 基于keepalived搭建MySQL热机集群
  19. C#获取文件类型
  20. Spring_bean的实例化时机

热门文章

  1. k8s-flannel容器集群网络部署
  2. AtCoder Beginner Contest 100 2018/06/16
  3. 【QT】《转载》常用快捷键
  4. MyEclipse修改Servlet模板
  5. requests.session保持会话
  6. 并查集基础 模板题 hdu1232 畅通工程
  7. .NETFramework:WebClient
  8. 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库
  9. 30.构建单机多容器环境-故障&31.构建单机多容器环境
  10. MYSQL数据库设计规范11111