使用自定义身份验证处理Spring 5中的AuthenticationException

时间:2018-08-06 15:44:05

标签: java spring spring-security

我正在尝试定义用于处理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

我在做什么错?我已经读了30篇SO的帖子,但没有很好的答案。

我还尝试使用自定义AuthenticationEntryPoint,它可以工作,但是我没有得到原始的异常,只有一个普通的异常根本无法帮助我。

我正在使用Spring 5。

如果缺少信息,请告诉我。我相信我正在共享相关的代码,因为这似乎是一个配置问题。我在authenticate()内调用JWTAuthenticationFilter方法后,抛出了AuthenticationException。

1 个答案:

答案 0 :(得分:0)

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

.formLogin()
        .failureHandler(authenticationFailureHandler())

相反,我必须像这样在UsernamePasswordAuthenticationFilter的构造函数中设置AuthenticationFailureHandler:

public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
  private AuthenticationManager authenticationManager;

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

我希望我能以自己的答案帮助某人。