Spring Security 5.0登录异常:There is no PasswordEncoder mapped for the id 'null'
解决Spring Security 5.0登录时的"There is no PasswordEncoder mapped for the id 'null'"异常
嗨,我来帮你搞定这个问题!你遇到的这个异常是Spring Security 5.0的关键变化导致的:从Spring Security 5开始,框架强制要求所有用户密码必须关联对应的密码编码器,而且密码字符串需要带上编码器的标识前缀(比如{noop}、{bcrypt})。你现在的配置里直接用了明文密码1234,没有指定任何编码器标识,所以系统会去找id为null的编码器,自然就抛出这个异常啦。
两种快速解决方法
方法1:给密码添加编码器前缀(最简单)
直接在你的用户密码前加上{noop}前缀,告诉Spring Security用明文编码器处理这个密码,不需要额外配置Bean:
<authentication-manager> <authentication-provider> <user-service> <!-- 给密码加上{noop}前缀 --> <user name="admin" password="{noop}1234" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager>
方法2:配置全局密码编码器
如果你不想给每个密码加前缀,可以在authentication-provider里指定统一的密码编码器,这里用适合测试场景的NoOpPasswordEncoder(注意:生产环境不要用这个,后面会说明):
<authentication-manager> <authentication-provider> <!-- 指定密码编码器 --> <password-encoder ref="noOpPasswordEncoder"/> <user-service> <user name="admin" password="1234" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager> <!-- 定义NoOpPasswordEncoder的Bean --> <bean id="noOpPasswordEncoder" class="org.springframework.security.crypto.password.NoOpPasswordEncoder" factory-method="getInstance"/>
生产环境注意事项
上面的NoOpPasswordEncoder是明文存储密码,非常不安全,只适合本地测试。生产环境一定要用加密强度高的编码器,比如BCryptPasswordEncoder:
- 先生成BCrypt加密后的密码(可以通过代码生成,比如
new BCryptPasswordEncoder().encode("1234")) - 把加密后的密码配置到XML里,加上
{bcrypt}前缀:
<user name="admin" password="{bcrypt}$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8." authorities="ROLE_USER" />
或者配置BCryptPasswordEncoder的Bean,然后在authentication-provider里引用它。
你的web.xml和控制器配置都是正常的,登录跳转流程没问题,只要解决密码编码器的问题,就能正常登录啦!
内容的提问来源于stack exchange,提问作者Gana
相关产品推荐
相关产品推荐

