首页 > 解决方案 > 使用自定义身份验证在 Spring 5 中处理 AuthenticationException

问题描述

我正在尝试为处理定义一个默认入口点AuthenticationException

这是我的配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .cors()
            .and()
        .csrf().disable()
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .addFilter(new JWTAuthenticationFilter(authenticationManager()))
        .addFilter(new JWTAuthorizationFilter(authenticationManager()))
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .formLogin()
            .failureHandler(authenticationFailureHandler())
            .permitAll();
}

@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
    return new RestAuthenticationFailureHandler();
}

我已经根据AuthenticationFailureHandler我的理解设置了处理所有AuthenticationException. 但取而代之的SimpleUrlAuthenticationFailureHandler是被调用。

我究竟做错了什么?我在 SO 中阅读了近 30 篇帖子,但都没有很好的答案。

我也尝试使用自定义AuthenticationEntryPoint并且它可以工作,但我没有得到原始异常,只有一个对我没有帮助的通用异常。

我正在使用 Spring 5。

如果缺少信息,请告诉我。我相信我正在分享相关代码,因为它似乎是一个配置问题。authenticate()在我调用JWTAuthenticationFilter.

标签: javaspringspring-security

解决方案


显然这根本不起作用,因为我使用的是 自定义身份验证

.formLogin()
        .failureHandler(authenticationFailureHandler())

相反,我必须在我的 UsernamePasswordAuthenticationFilter 的构造函数中设置 AuthenticationFailureHandler ,如下所示:

public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
  private AuthenticationManager authenticationManager;

  public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
      this.authenticationManager = authenticationManager;
      this.setAuthenticationFailureHandler(new RestAuthenticationFailureHandler());
  }
}

我希望我能用我自己的答案帮助别人。


推荐阅读