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

使用Spring Security 5无法登录应用的问题求助

解决Spring Security登录"Bad credentials"且必须用编码器的问题

嘿,我来帮你捋清楚这个问题!首先得明确:Spring Security 5.x及以后的版本强制要求密码必须通过编码器处理,已经不再支持直接用明文密码验证了,所以“不使用编码器”这个需求其实不符合当前框架的规范,但我们可以根据你的场景选合适的方案:

场景1:仅测试环境想用明文密码(绝对别在生产用!)

如果只是测试需要快速验证,有两种简单办法:

  • 办法1:给密码加{noop}前缀
    比如你的用户密码是admin123,存储的时候直接写成{noop}admin123就行。Spring Security看到这个前缀,就会自动用专门处理明文的编码器来验证,不需要额外配置任何bean。

  • 办法2:显式配置过时的明文编码器(仅测试)
    这个编码器已经被标记为废弃了,生产环境碰都别碰,但是测试用的话可以这么配XML:

    <bean id="passwordEncoder" class="org.springframework.security.crypto.password.NoOpPasswordEncoder" factory-method="getInstance"/>
    
    <sec:authentication-manager>
        <sec:authentication-provider>
            <!-- 这里可以配置内存用户或者数据库用户来源 -->
            <sec:user-service>
                <sec:user name="admin" password="admin123" authorities="ROLE_ADMIN"/>
            </sec:user-service>
            <!-- 指定用上面的明文编码器 -->
            <sec:password-encoder ref="passwordEncoder"/>
        </sec:authentication-provider>
    </sec:authentication-manager>
    

场景2:生产环境正确配置安全的编码器(强烈推荐)

生产环境必须用安全的密码哈希算法,比如BCrypt,这才是正经做法,给你XML配置示例:

  1. 先配置BCrypt编码器的bean:
    <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
    
  2. 配置认证管理器,指定使用这个编码器,注意这里的用户密码必须是提前用BCrypt加密后的字符串(比如明文admin123加密后会变成类似$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.的长串):
    <sec:authentication-manager>
        <sec:authentication-provider>
            <sec:user-service>
                <sec:user name="admin" password="$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8." authorities="ROLE_ADMIN"/>
            </sec:user-service>
            <sec:password-encoder ref="passwordEncoder"/>
        </sec:authentication-provider>
    </sec:authentication-manager>
    
  3. 如果是从数据库读用户信息,自定义UserDetailsService的时候,也要保证数据库里存的是加密后的密码,Spring Security会自动用你配置的编码器去对比输入的明文和存储的哈希值。

为啥你会碰到"Bad credentials"错误?

因为你没配置编码器,也没给密码加前缀,Spring Security默认会用DelegatingPasswordEncoder来验证,它默认的编码器是BCrypt,你的明文密码根本不是BCrypt的哈希格式,自然验证失败,就抛出了"Bad credentials"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:20:33