扫码阅读
手机扫码阅读

一个奇怪的登录需求

107 2024-11-28

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:一个奇怪的登录需求
文章来源:
江南一点雨
扫码关注公众号

摘要

松哥在微信群中回应了一个关于Spring Security登录需求的问题,该问题关注如何区分用户名不存在和密码错误的异常。这一需求虽不常见,但有助于加深对Spring Security的理解。

1. 问题再现

通常,登录失败时服务端会给出模糊提示以保安全,而默认情况下,Spring Security会封装用户名不存在的异常,使得开发者只能获得一个表示用户名或密码错误的BadCredentialsException。

2. 源码分析

在Spring Security中,AbstractUserDetailsAuthenticationProvider类负责校验用户名和密码。若要抛出具体的用户名不存在异常,需要修改类中的hideUserNotFoundExceptions属性,默认为true。

3. 登录流程

Spring Security的认证工作主要由AuthenticationManager接口的实现类ProviderManager完成,并通过管理多个AuthenticationProvider来进行用户校验工作。ProviderManager分为全局和局部,最终是否抛出异常取决于全局ProviderManager。

4. 思路分析

要抛出UsernameNotFoundException异常,需在全局ProviderManager中获取DaoAuthenticationProvider实例,然后调用setHideUserNotFoundExceptions方法修改属性值。

5. 具体实践

在WebSecurityConfigurerAdapter类中,通过配置AuthenticationManagerBuilder来生成全局ProviderManager。示例代码展示了如何创建DaoAuthenticationProvider实例,并设置其属性和用户数据源,最终生成全局ProviderManager。

6. 小结

本文分享了在Spring Security中抛出UsernameNotFoundException异常的方法,帮助深化理解。此外,还提供了一个简单实现方式,即在UserDetailsService中抛出自定义异常,这种异常不会被隐藏。

同时,宣布了TienChin项目视频的发布,该项目使用Spring Boot和Vue3,完成率超过90%。

想要了解更多内容?

查看原文:一个奇怪的登录需求
文章来源:
江南一点雨
扫码关注公众号