首页
学习
活动
专区
工具
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 中查找用户查找不到时,抛出自定义的异常,这个自定义的异常不会被隐藏,这个比较简单,

41420

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

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

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

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

    1.1K20

    SpringSecurity入坑(五)

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

    87860

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

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

    1.6K20

    SpringSecurity认证流程分析

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

    65510

    Spring Security 架构与源码分析

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

    76010

    👍SpringSecurity单体项目最佳实践

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

    27510

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

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

    57540

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

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

    1.4K20

    详解SpringSecurity认证

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

    24810

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

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

    2.2K21

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

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

    67210

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

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

    2.3K71
    领券