一、前言
《SpringBoot 集成 Spring Security》系列文章,原本只是我自己学习后写的笔记,没想到受到大家的欢迎,能够对大家带来帮助,让我感到十分高兴。但说起来我也只是初学者,这一系列文章中可能也存在错误,本文是为了解决 UserNotFoundException 这个异常无法抛出而写出。
这个问题大致是这样的,我们知道 Spring Security 的验证处理是由某个 Provider 处理的,在 Provider 中通过对应的 UserDetailsService 的 loadUserByUsername()
来决定如何加载数据库中的用户信息。
以 《SpringBoot集成Spring Security(3)——异常处理》 代码为例,采用默认的用户名密码登陆方式,我们在 CustomUserDetailsService
类中,有这么一行代码:
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
...
// 判断用户是否存在
if(user == null) {
throw new UsernameNotFoundException("用户名不存在");
}
...
}
但是实际运行后你会发现,当用户不存在时,只会抛出 BadCredentialsException
,而不是 UsernameNotFoundException
,百度下后发现这个问题的人不在少数。在本文中,我将介绍为什么会无法抛出 UsernameNotFoundException
,以及如何解决这个问题。
二、导致的原因是什么?
首先说明,出现这种情况只有在你使用默认的用户名密码登陆方式,且没有自定义 Provider 的情况下,才会发生!如果你有自定义 Provider,仍然出现这个问题,说明代码写的有问题,这一点在后面我会说。
由提供的源码地址中,第三章和第四章两篇文章是一个项目。分别是
springboot_security03
和springboot_security03_filter
。由于前者是自定义 Provider 实现,因此理论上不会出现这个问题,所以我们以后者代码为例。
运行 springboot_security03_filter
项目,发现当用户不存在时,的确抛出的是 BadCredentialsException。我们给抛出异常那行代码加断点,进行调试。
@Service(