我有一个启用了spring-security的spring-boot应用程序。我有一个自定义的 AbstractPreAuthenticatedProcessingFilter ,用于检查外部系统设置的某些身份验证令牌的请求标头。如果令牌不存在或无效,则相应的 AuthenticationManager 将抛出 AuthenticationException 。看起来很简单。
我的问题是,我希望能够通过回复403(禁止)状态来处理此 AuthenticationException 。我该怎么做?我尝试将以下内容添加到 WebSecurityConfigurerAdapter :
@Override
protected void configure(HttpSecurity http) throws Exception {
http.exceptionHandling()
.authenticationEntryPoint(new Http403ForbiddenEntryPoint());
...
但它不起作用。问题是假设(如果我理解正确)处理这些事情的 ExceptionTranslationFilter 是默认安全过滤器链中的最后一个过滤器,抛出的异常永远不会到达它。我完全卡住了。这应该怎么样?请帮忙!
答案 0 :(得分:1)
很久以前你的问题已经完成,但我没有解决方案就陷入了同样的问题,所以我决定解释如何解决这个问题。
您可以编辑FilterChain,您可以在PreAuthenticationFilter之前放置一个ExceptionTranslationFilter作为...
http
.csrf().disable()
.addFilter(myPreAuthenticationFilter)
.addFilterBefore(new ExceptionTranslationFilter(
new Http403ForbiddenEntryPoint()),
myPreAuthenticationFilter.getClass()
)
.authorizeRequests()
.antMatchers(authSecuredUrls).authenticated()
.anyRequest().permitAll()
.and()
.httpBasic()
.authenticationEntryPoint(new Http403ForbiddenEntryPoint())
;
如果没有提供任何凭据,则您的AbstractPreAuthenticatedProcessingFilter getPreAuthenticatedCredentials或getPreAuthenticatedPrincipal方法可能会抛出AuthenticationException。
if ( !StringUtils.hasText(request.getParameter("MY_TOKEN")) ) {
throw new BadCredentialsException("No pre-authenticated principal found in request");
}
或者您的AuthenticationManager身份验证方法也可以抛出AuthenticationException。