spring安全过滤器链在“exceptiontranslationfilter”情况下的工作原理`

lrpiutwd  于 2021-07-16  发布在  Java
关注(0)|答案(0)|浏览(187)

从当前的文档中可以看出,Spring Security 似乎可以保持 ExceptionTranslationFilter 在启动身份验证过程以捕获 AuthenticationException 如果有的话。
但是,这是我们开箱即用的默认配置。

Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  LogoutFilter
  UsernamePasswordAuthenticationFilter
  DefaultLoginPageGeneratingFilter
  DefaultLogoutPageGeneratingFilter
  BasicAuthenticationFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]

下面是作为过滤器的伪代码提供的代码段。

try {
    filterChain.doFilter(request, response); 
} catch (AccessDeniedException | AuthenticationException ex) {
    if (!authenticated || ex instanceof AuthenticationException) {
        startAuthentication(); 
    } else {
        accessDenied(); 
    }
}

在给定的链中,如果 UsernamePasswordAuthenticationFilter 以及 HttpBasicAuthenticationFilter 置于之前 ExceptionTranslationFilter ,那么它如何能够捕获这些筛选器中是否引发了任何异常?
我也试过调试,好像有一次 UsernamePasswordAuthenticationFilter 得出结论,提供的凭据是错误的,它只是退出 VirtualFilterChain 返回语句。
编辑
假设这些身份验证过滤器只在用户实际尝试登录时才起作用,即post/登录,在其他情况下,这些过滤器不会触发和关闭 ExceptionTranslationFilter 捕捉 AuthenticationException 或者 AccessDeniedException 仅在这些情况下。
如果这种理解是正确的,并且所有请求都处于锁定状态:

http
        .authorizeRequests()
          .anyRequest().authenticated();

这仍然会产生 AccessDeniedException 陷入困境 ExceptionTranslationFilter .
什么样的情况或场景 ExceptionTranslationFilter 真的抓到一个 AuthenticationException ?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题