GeXiangDong

精通Java、SQL、Spring的拼写,擅长Linux、Windows的开关机

0%

Spring Security 5.x 的默认密码保存方式

Spring Security 5.x 开始把密码机制升级了,使用DelegatingPasswordEncoder。 这是一种支持多种加密密码并存的方法,取代了以前只支持一种密码机制的方法。

这种升级需要密码的密文增加一个前缀,来说明密文是通过那种办法加密的,例如之前用 BCryptPasswordEncoder 加密出来的密文

$2a$10$H2z/oHZgviqC8srzsCZq/ObzTNRTfygC4N0NEZlm5trYPFrvdNHeS

需要被存储为:

{bcrypt}$2a$10$H2z/oHZgviqC8srzsCZq/ObzTNRTfygC4N0NEZlm5trYPFrvdNHeS

如果是从 spring security 4.x 升级过了,需要修改下数据库里保存的密文密码。

在开发测试过程中可以使用 {noop}12345 这样的明文密码就比较方便了。

可能遇到的异常或警告

下面2种异常/警告 都是和密码加密有关的。

WARN o.s.s.c.bcrypt.BCryptPasswordEncoder - Encoded password does not look like BCrypt

这个警告是因为密文前缺少{bcypt},用了BCryptPasswordEncoder去match,Spring 会给出这个警告。

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

这也是因为密文没有指明加密方式的前缀,用了DelegatingPasswordEncoder去match这个password是否正确,密文的加密方法前缀是null,才出这个错。

其它

另外需要注意的,除了WebSecurityConfigurerAdapter会涉及到登录用户的密码外,在oauth Authentication Server的 ClientDetail 里的 client_secret 也需要类似处理。

参考

https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-encoding