如何解决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 {
1976 1
|
存储 安全 Java
Security认证流程源码分析
Security认证流程源码分析
377 1
|
存储 安全 Java
学成在线笔记+踩坑(12)——用户认证
连接用户中心数据库、账号密码认证、验证码认证
学成在线笔记+踩坑(12)——用户认证
|
缓存 安全 Java
JAVA实现用户登录错误N次后,账户暂时锁定
JAVA实现用户登录错误N次后,账户暂时锁定
1486 0
JAVA实现用户登录错误N次后,账户暂时锁定
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
2803 0
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
1368 1
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
8113 14
Spring Boot 3 集成 Spring Security + JWT
|
安全 Java Spring
Spring Security 报:Encoded password does not look like BCrypt
Spring Security 报:Encoded password does not look like BCrypt
752 1

热门文章

最新文章