使用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配置示例:
- 先配置BCrypt编码器的bean:
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> - 配置认证管理器,指定使用这个编码器,注意这里的用户密码必须是提前用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> - 如果是从数据库读用户信息,自定义
UserDetailsService的时候,也要保证数据库里存的是加密后的密码,Spring Security会自动用你配置的编码器去对比输入的明文和存储的哈希值。
为啥你会碰到"Bad credentials"错误?
因为你没配置编码器,也没给密码加前缀,Spring Security默认会用DelegatingPasswordEncoder来验证,它默认的编码器是BCrypt,你的明文密码根本不是BCrypt的哈希格式,自然验证失败,就抛出了"Bad credentials"。
内容的提问来源于stack exchange,提问作者Andrew Valevskiy
相关产品推荐
相关产品推荐

