从当前的文档中可以看出,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
?
暂无答案!
目前还没有任何答案,快来回答吧!