You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 先生成BCrypt加密后的密码(可以通过代码生成,比如new BCryptPasswordEncoder().encode("1234"))
  2. 把加密后的密码配置到XML里,加上{bcrypt}前缀:
<user name="admin" password="{bcrypt}$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8." authorities="ROLE_USER" />

或者配置BCryptPasswordEncoder的Bean,然后在authentication-provider里引用它。

你的web.xml和控制器配置都是正常的,登录跳转流程没问题,只要解决密码编码器的问题,就能正常登录啦!

内容的提问来源于stack exchange,提问作者Gana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:20:19