首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不能在我的自定义AuthenticationProvider中抛出或处理BadCredentialsException?

在自定义的AuthenticationProvider中,不建议直接抛出或处理BadCredentialsException异常的原因如下:

  1. 责任分离:AuthenticationProvider的主要职责是验证用户的身份信息,而不是处理验证失败的异常。AuthenticationProvider应该专注于验证用户提供的凭据是否正确,而不是处理验证失败的具体逻辑。将异常处理的责任交给其他组件,可以使代码更加清晰和易于维护。
  2. 安全性:直接在AuthenticationProvider中处理BadCredentialsException可能会导致安全漏洞。如果在验证过程中抛出异常,攻击者可以通过观察异常信息来获取有关系统内部的敏感信息,从而增加系统受到攻击的风险。
  3. 可扩展性:通过将异常处理的责任交给其他组件,可以更容易地扩展和定制验证失败的逻辑。例如,可以使用Spring Security提供的AuthenticationFailureHandler接口来定义验证失败时的处理逻辑,包括记录日志、发送警报等。
  4. 统一性:将异常处理的责任交给其他组件可以实现验证失败的统一处理。通过使用统一的异常处理组件,可以确保在整个应用程序中对验证失败的处理逻辑保持一致,提高代码的可维护性和可读性。

综上所述,为了保持代码的清晰性、安全性、可扩展性和统一性,不建议在自定义的AuthenticationProvider中直接抛出或处理BadCredentialsException异常。相反,建议将异常处理的责任交给其他组件来处理验证失败的逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一个奇怪登录需求

在 Spring Security ,负责用户校验工作类有很多,这里就不一一列举了(感兴趣小伙伴可以查看《深入浅出Spring Security》一书),这里直接说我们涉及到关键类 AbstractUserDetailsAuthenticationProvider...,如果没找到,就会抛出一个 UsernameNotFoundException,这个异常被 catch 之后,会首先判断是否要隐藏这个异常,如果隐藏,则原异常原封不动抛出来,如果需要隐藏,则抛出一个新...思路分析 首先我们用户校验工作在局部 ProviderManager 中进行,局部 ProviderManager 管理了若干个 AuthenticationProvider,这若干个 AuthenticationProvider...所管理 DaoAuthenticationProvider 没做任何特殊处理,那么局部 ProviderManager 抛出 UsernameNotFoundException 异常最终还是会被隐藏...题外话: ❝这个需求还有一个简单实现方式,就是自定义一个用户不存在异常,当在 UserDetailsService 查找用户查找不到时,抛出自定义异常,这个自定义异常不会被隐藏,这个比较简单,

36820

Spring Security异常上抛机制及对于转型处理一些感悟

在使用Spring Security过程,我们会发现框架内部按照错误及问题出现场景,划分出了许许多多异常,但是在业务调用时一般都会向外抛一个统一异常出来,为什么要这样做呢,以及对于抛出异常...,我们又该如何分场景进行差异化处理呢,今天来跟我一起看看吧。  ...在这个验证登陆方法,会验证各种场景下登陆是否合法,就有可能出现很多异常场景,诸如: 密码不正确 BadCredentialsException 账号是否被锁定 LockedException 账号是否被禁用...但是你会发现在验证方法那里统一抛出是他们统一父类AuthenticationException,这里用到就是自动向上转型。...if (throwable instanceof BadCredentialsException) 调整后代码 在外层根据不同异常而做不同业务处理代码就可以改造为如下 @PostMapping

31010

【SpringSecurity系列02】SpringSecurity 表单认证逻辑源码解读

由于过滤器链过滤器实在太多,没有一一列举,调了几个比较重要介绍一下。...ProviderManger维护这一个AuthenticationProvider对象列表,通过遍历判断并且最后选择DaoAuthenticationProvider对象来完成最后认证。...对象根据session策略写入session,将认证结果写入到SecurityContextHolder,如果开启了记住功能,则根据记住功能,生成token并且写入cookie,最后调用一个successHandler...对象方法,这个对象可以是我们配置注入,用于处理我们自定义登录成功一些逻辑(比如记录登录成功日志等等)。...如果登录失败,则清空SecurityContextHolder信息,并且调用我们自己注入failureHandler对象,处理我们自己登录失败逻辑。

79220

SpringSecurity入坑(五)

* 如果需要自定义逻辑来比较 UserDetails 和 * UsernamePasswordAuthenticationToken 其他*属性,则这些属性也应出现在此方法。...* 如果需要自定义逻辑来比较 UserDetails 和 * UsernamePasswordAuthenticationToken 其他*属性,则这些属性也应出现在此方法。...* @param authentication 认证方式 * @throws AuthenticationException SneakyThrow 将避免javac坚持要求您捕获向前抛出方法主体语句声明它们生成所有检查异常....disable(); } 自定义实现登录到这里,发现文档虽然很傻,但是好像对比源码来看的话,还是有点东西,基本上需要都能找到。...新手建议直接阅读,源码有的地方写属实是看不懂,很多地方,不对比着来看话,可能就懵了,多看点源码靠谱,最近喜欢研究研究,很多技术有点不感冒,感觉可能也看不太多,今年目标读一本书正在循序渐进,一起加油吧

84360

【SpringSecurity系列(十一)】自定义认证逻辑

之前我们自定义一个核心思路就是自定义过滤器,在过滤器做各种各样我们想做事: Spring Security 如何添加登录验证码?...举一个简单例子,在添加登录验证码为了校验验证码就自定义了一个过滤器,并把这个自定义过滤器放入 SpringSecurity 过滤器链,每次请求都会通过该过滤器。...例如处理 UsernamePasswordAuthenticationToken AuthenticationProvider 是 DaoAuthenticationProvider。...这样既不破坏原有的过滤器链,又实现了自定义认证功能。常见手机号码动态登录,也可以使用这种方式来认证。 好了, bb 了,咱们上代码。...从当前请求拿到 code 参数,也就是用户传来验证码。 从 session 获取生成验证码字符串。 两者进行比较,如果验证码输入错误,则直接抛出异常。

1.4K20

SpringSecurity认证流程分析

DaoAuthenticationProvider 用来支持用户名 密码登录认证 RememberMeAuthenticationProvider 用来支持记住认证 当用户使用用户名密码方式登录时候...,根据用户名去缓存查询用户对象,如果查询不到,则根据用户名调用retrieveUser方法从数据中加载用户;如果没有加载到用户,则抛出异常。...判断AuthenticationProvider是否支持当前Authentication,如果不支持,继续处理下一个AuthenticationProvider对象 调用provider.authenticate...对于可能是多个AuthenticationProvider执行认证操作,所以如果抛出异常,则通过lastException变量记录。...如果result不为空,将result凭证擦擦,防止泄露。如果使用了用户名密码方式登录,那么所谓擦除就是将密码字段设置为null,同时将登录事件发布出去。

59310

Spring Security 架构与源码分析

默认使用ThreadLocal 存储,意味SecurityContext在相同线程方法都可用。...在Authenticationprincipal通常是用户名,我们可以通过UserDetailsService来通过principal获取UserDetails: public interface...认证失败抛出AuthenticationException 如果无法确定,则返回null AuthenticationException是运行时异常,它通常由应用程序按通用方式处理,用户代码通常不用特意被捕获和处理这个异常...AuthenticationManager默认实现是ProviderManager,它委托一组AuthenticationProvider实例来实现认证。...web security 如何实现 Web层Spring Security(用于UI和HTTP后端)基于Servlet Filters,下图显示了单个HTTP请求处理程序典型分层。

73410

👍SpringSecurity单体项目最佳实践

当然可以自定义登陆页面,但是在自定义登陆页面之前,我们需要简单处理一下我们实体类。 在用户登录时,系统会根据用户名,从存储设备查找该用户密码及权限等,将其组装成一个UserDetails对象。...并用UserDetails数据对用户进行认证,决定其输入用户名/密码是否正确。...就是SecurityUserDetailsService接口 ⭕️ 它肯定也有默认实现类,但是我们需要查询数据库对应用户数据,所以我们还是采用自定义方式去完成。...userService).passwordEncoder(new BCryptPasswordEncoder()); // 自定义认证规则 // AuthenticationProvider...user.getPassword().equals(password)) { throw new BadCredentialsException("账号密码错误

18910

你有没有遇到要实现多种登录方式场景丫 一起来看看咯 Spring Security 实现多种登录方式,如常规方式外邮件、手机验证码登录

,ProviderManager 又委托给 AuthenticationProvider 进行处理 我们自定义一个 EmailCodeAuthenticationProvider 实现 AuthenticationProvider...:处理登录失败操作 ---- 接下来,是模仿着源码写出代码,建议大家可以在使用时候,多去看看,这里去除了一些不是和这个相关代码。...UserDetails ,如果提供凭据不正确,则可以选择立即抛出AuthenticationException (如果需要以用户身份绑定到资源以获得生成一个UserDetails ) */ protected...将登录成功处理、登录失败处理器注入到Spring,或者在自定义过滤器对登录成功和失败进行处理。...你好,是博主宁在春:CSDN主页 如若在文章遇到疑惑,请留言私信,或者加主页联系方式,都会尽快回复。 如若发现文章存在问题,望你能够指正,不胜感谢。

1.3K20

Security 登录认证流程详细分析 源码与图相结合

列表每一个 AuthenticationProvider将会被依次查询是否需要通过其进行验证,每个 provider验证结果只有两个情况:抛出一个异常或者完全填充一个 Authentication...在这个阅读删除了许多杂七杂八代码,一些判断,异常处理都去掉了,只针对最重要那几个看。...列表挑选其对应支持provider对相应 Authentication对象进行验证 这个知识和实现多种登录方式相关联,简单说一下理解。...UserDetails ,如果提供凭据不正确,则可以选择立即抛出AuthenticationException (如果需要以用户身份绑定到资源以获得生成一个UserDetails ) */ protected...出于安全目的,Spring Security 直接使用实现。 它们只是存储用户信息,然后将这些信息封装到Authentication对象

52840

详解SpringSecurity认证

应测试异常,如果适用,应按上述顺序抛出(即,如果帐户被禁用锁定,则身份验证请求将立即被拒绝,并且不执行凭据测试过程)。这可以防止针对已禁用锁定帐户测试凭据。...请求处理完毕后,Spring Security 会将 SecurityContextHolder 数据拿出来保存到 Session ,同时将 SecurityContexHolder 数据清空...以及调用记住等,并回调 AuthenticationSuccessHandler 处理 认证失败,清除 SecurityContextHodler 以及 记住中信息,回调 AuthenticationFailureHandler...处理 三者关系 从上面分析得知,AuthenticationManager 是认证核心类,但实际上在底层真正认证时还离不开 ProviderManager 以及 AuthenticationProvider...换句话说,在ProviderManager 存在一个 AuthenticationProvider 列表,在Provider Manager 遍历列表每一个 AuthenticationProvider

11010

手把手带你在集成SpringSecuritySpringBoot应用添加短信验证码登录认证功能

前言 在上一篇文章一文理清SpringSecurity基于用于名密码登录认证流程笔者有详细地介绍了Spring Security登录认证流程,也为我们在工作面需要实现自定义登录认证如手机号+...AuthenticationProvider类 我们自定义MobilePhoneAuthenticationProvider类时候 我们参照了AbstractUserDetailsAuthenticationProvider...类源码, 同时实现了AuthenticationProvider、InitializingBean和MessageSourceAware等三个接口 同时为了实现手机号+短信验证码登录认证功能,我们在这个类添加了...("phoneCode is expired"); } // 用户登录携带短信验证码与redis根据手机号查询出来登录认证短信验证码不一致则抛出验证码错误异常...方法,同时在两个configure方法增加新逻辑处理

1.6K21

浅析 Spring Security 认证过程及相关过滤器

核心过滤器链简介 Spring Security 过滤器有很多,一般正常项目中都有十几个过滤器,有时候还包含自定义过滤器,当然我们不可能对每一个过滤器都进行分析,我们需要抓住重点,找比较关键几个过滤器...一般作用是用于匿名登录。 ExceptionTranslationFilter:异常转换过滤器,用于处理 FilterSecurityInterceptor抛出异常。...列表,列表每一个 AuthenticationProvider将会被依次查询是否需要通过其进行验证,每个 provider验证结果只有两个情况:抛出一个异常或者完全填充一个 Authentication...方法,内部调用加密解密器进行密码匹配,如果匹配失败,则抛出一个 BadCredentialsException异常 最后通过createSuccessAuthentication(..)方法生成一个成功认证...若比对成功,则进入真正系统请求处理逻辑,反之,会抛出相应异常 下面画一张简易流程图来阐述 FilterSecurityInterceptor执行过程,如下: filter_processs 根据上图内容

62010

Spring Security如何优雅增加OAuth2协议授权模式

在这种模式,用户直接向客户端注册,客户端以自己名义要求"服务提供商"提供服务,其实不存在授权问题。 四种授权模式分别使用不同 grant_type 来区分 二、为什么自定义授权类型?...所以目前在 Spring Security 中比较优雅和灵活扩展方式就是通过自定义 grant_type 来增加授权模式。...三、实现思路 在扩展之前首先需要先了解 Spring Security 整个授权流程,以 密码模式 为例去展开分析,如下图所示 [Spring Security 授权时序图.jpg] 3.1....所有 AuthenticationProvider 实现类都通过 ProviderManager providers 集合存起来。...而 ProviderManager 则通过 AuthenticationToken 来判断具体使用那个 AuthenticationProvider 实现类来处理授权。

2K71
领券