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