关于There is no PasswordEncoder mapped for the id null的报错

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/107056906


最近在做 Spring Boot + Spring Security 登录认证的时候,我已经在认证策略配置的认证信息管理方法中配置了一个身份信息,而且在登录页面中用户名和密码输入完全正确的情况下,却一直在报 There is no PasswordEncoder mapped for the id null 的错误。经过网上查询相关资料才知问题所在,特此总结,如果能帮助到你那就再好不过了。


报错信息

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

报错信息



报错原因及解决方式

在认证策略配置中的认证信息管理方法里我是这样配置的:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
	auth.inMemoryAuthentication().withUser("admin").password("123").roles("ADMIN");  
}

结果导致了一直在报上面那个错误,后来才知这是因为在 Spring Security 5.0 中新增了多种加密方式,也改变了密码的格式。

Spring Security 官方推荐的是使用 BCrypt 加密方式。在这里我不得不说一下 MD5 加密现在已经弱爆了,目前 最新版的 Spring Security 中已经把 MD5 剔除了,MD5 太不安全了,更推荐用 BCrypt 加密,而且什么盐值加密也很少用,因为 BCrypt 中已经将 salt 加进去了。

那么如何对密码加密呢,只需要在 configure() 方法里面指定一下。修改后是这样的:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .passwordEncoder(new BCryptPasswordEncoder())
        .withUser("admin")
        .password(new BCryptPasswordEncoder().encode("123"))
        .roles("ADMIN");
}

我们从上面的方法中不难看出:在 inMemoryAuthentication() 方法后面多了 .passwordEncoder(new BCryptPasswordEncoder()) ,这相当于登录时就要求用 BCrypt 加密方式对用户密码进行处理。以前的 .password("123456") 也变成了 .password(new BCryptPasswordEncoder().encode("123")) ,这相当于对内存中的密码也进行 BCrypt 加密。比对一致,就说明密码正确,允许登录。

如果你现在用的也是从内存中取密码,那么按照上面这么修改后应该会成功登录没有问题的。



博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小异常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值