我正在尝试定义用于处理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。
答案 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());
}
}
我希望我能以自己的答案帮助某人。