如何解决security中异常UsernameNotFoundException总是抛出密码错误问题

简介: 如何解决security中异常UsernameNotFoundException总是抛出密码错误问题

使用spring security进行授权登录的时候,发现登录接口无法正常捕捉UsernameNotFoundException异常,捕捉到的一直是BadCredentialsException异常。我们的预期是:

  • UsernameNotFoundException -> 用户名错误
  • BadCredentialsException -> 密码错误

贴几个比较重要的代码:

经过步进法跟踪代码,发现问题所在,位于

AbstractUserDetailsAuthenticationProvider
public Authentication authenticate(Authentication authentication)

结论

1、loadUserByUsername方法确实抛出了UsernameNotFoundException

2、走到AbstractUserDetailsAuthenticationProvider的authenticate方法的时候,如果hideUserNotFoundExceptions = true,直接就覆盖了UsernameNotFoundException异常并抛出BadCredentialsException异常,这也就解释了,为什么总是捕捉到BadCredentialsException异常

既然已经找到了是因为hideUserNotFoundExceptions = true导致的问题,那把hideUserNotFoundExceptions = false不就完事了吗?

方案1、修改WebSecurityConfig配置,添加AuthenticationProvider Bean

AbstractUserDetailsAuthenticationProvider
public Authentication authenticate(Authentication authentication)

然后配置

   @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(daoAuthenticationProvider());
    }

方案2、在自己的登录验证接口中不用抛出UsernameNotFoundException异常,直接抛出自定义异常,这个异常会被全局异常拦截

@Service
public class MyUserDetailService implements UserDetailsService {
 
    @Resource
    private SysUserService sysUserService;
 
    @Resource
    private SysRoleService sysRoleService;
 
    @Override
    public UserDetails loadUserByUsername(String userName){
       
        SysUser sysUser = sysUserService.getByUserName(userName);
 
        if (StringUtils.isNull(sysUser)) {
            throw new CustomException("用户不存在");
        } 
        // 查询账号角色
        List<String> roleList = sysRoleService.getListByUserId(sysUser.getUserId());
 
        return new UserVo(sysUser,new ArrayList<>());
    }
}

配置

 @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailService).passwordEncoder(bCryptPasswordEncoder());
    }

 


相关文章
|
安全 前端开发 Java
Spring Security系列教程25--解决Spring Security环境中的跨域问题
前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题。 一. 启用Spring Security 的CORS支持 1. 创建web接口 我先在SpringBoot环境中,创建一个端口号为8080的web项目,注意这个web项目没有引入Spring Security的依赖包。然后在其中创建一个IndexController,定义两个测试接口以便被ajax进行跨域访问。 @RestController public class IndexController {
1888 1
|
存储 安全 Java
Security认证流程源码分析
Security认证流程源码分析
296 1
|
安全 Java 数据库连接
Security自定义全局AuthenticationManager
Security自定义全局AuthenticationManager
916 1
|
缓存 前端开发 JavaScript
Vue项目打包部署Nginx配置及前端缓存问题解决
Vue项目打包部署Nginx配置及前端缓存问题解决
2463 0
Vue项目打包部署Nginx配置及前端缓存问题解决
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
2445 0
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
7759 14
Spring Boot 3 集成 Spring Security + JWT
|
Java API Spring
Spring Boot中的API版本控制
Spring Boot中的API版本控制
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
2912 0
|
Java 数据库连接 数据库
【潜意识Java】使用 Ruoyi 框架开发企业级应用,从零开始的实践指南和分析问题
本文介绍了基于Spring Boot的开源企业级框架Ruoyi,涵盖环境搭建、项目初始化及用户管理模块的创建。
2016 4