SpringBoot 集成 Spring Security(9)——解决 UserNotFoundException 不抛出问题

一、前言

《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_security03springboot_security03_filter。由于前者是自定义 Provider 实现,因此理论上不会出现这个问题,所以我们以后者代码为例。

运行 springboot_security03_filter 项目,发现当用户不存在时,的确抛出的是 BadCredentialsException。我们给抛出异常那行代码加断点,进行调试。

@Service(
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值