Spring Security默认认证事件方案失效问题及改进建议
自定义AuthenticationProvider异常导致认证失败事件无法触发的问题排查与建议
问题背景
我实现了自定义MyAuthenticationProvider,它会抛出继承自BadCredentialsException的自定义异常MyException。认证成功与失败逻辑可正常运行,但认证失败时无法触发认证失败事件的发布,日志提示:
DefaultAuthenticationEventPublisher : No event was found for the exception MyException
官方方案失效情况
我从Spring Security官方文档《Authentication Events - Default Event》复制了触发未映射异常事件发布的代码,但并未生效:
@Bean public AuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { DefaultAuthenticationEventPublisher authenticationEventPublisher = new DefaultAuthenticationEventPublisher(applicationEventPublisher); authenticationEventPublisher.setDefaultAuthenticationFailureEvent(AbstractAuthenticationFailureEvent.class); return authenticationEventPublisher; }
通过断点调试DefaultAuthenticationEventPublisher.publishAuthenticationFailure方法发现,constructor.newInstance(authentication, exception)因使用抽象类AbstractAuthenticationFailureEvent而静默失败,且代码中的catch块直接忽略了反射异常。
可行解决方案
将代码改为使用自定义的AbstractAuthenticationFailureEvent子类后,未映射异常可正常触发失败事件发布:
@Bean public AuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { DefaultAuthenticationEventPublisher authenticationEventPublisher = new DefaultAuthenticationEventPublisher(applicationEventPublisher); authenticationEventPublisher.setDefaultAuthenticationFailureEvent(UnmappedAuthenticationFailureEvent .class); return authenticationEventPublisher; } public static class UnmappedAuthenticationFailureEvent extends AbstractAuthenticationFailureEvent { public UnmappedAuthenticationFailureEvent(Authentication authentication, AuthenticationException exception) { super(authentication, exception); } }
问题与改进建议
疑问
- 官方文档建议直接使用
AbstractAuthenticationFailureEvent是否有误? DefaultAuthenticationEventPublisher代码中忽略反射异常是否不合理?
改进请求
- 修改官方文档,建议使用继承自
AbstractAuthenticationFailureEvent的具体类而非抽象类本身; - 在
publishAuthenticationFailure的catch块中添加TRACE或DEBUG级别的诊断日志,帮助开发者快速定位问题。
补充说明:缺乏诊断日志导致排查官方方案失效问题耗时费力,现有资源无法解决该问题,添加日志可有效提升调试效率。
内容的提问来源于stack exchange,提问作者Justin Cranford
相关产品推荐
相关产品推荐

