故障排除
当存储的密码之一没有 id(如“密码存储格式”一节中所述)时,会发生以下错误。
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:233)
at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:196)
解决该错误的最简单方法是切换为显式提供PasswordEncoder
您的密码是用它编码的。解决此问题的最简单方法是找出您的密码当前的存储方式并明确提供正确的密码PasswordEncoder
。如果您从 Spring Security 4.2.x 迁移,您可以通过公开NoOpPasswordEncoder
豆。例如,如果您使用 Java 配置,则可以创建如下所示的配置:
恢复到NoOpPasswordEncoder
不被认为是安全的。您应该改为使用DelegatingPasswordEncoder
支持安全密码编码。
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
如果您使用 XML 配置,您可以公开PasswordEncoder
与身份证passwordEncoder
:
<b:bean id="passwordEncoder"
class="org.springframework.security.crypto.NoOpPasswordEncoder" factory-method="getInstance"/>
或者,您可以在所有密码前添加正确的 ID 并继续使用DelegatingPasswordEncoder
。例如,如果您使用 BCrypt,您可以从以下位置迁移您的密码:
$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
to
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG