java - 使用自定义身份验证在 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
.
解决方案
显然这根本不起作用,因为我使用的是 自定义身份验证:
.formLogin()
.failureHandler(authenticationFailureHandler())
相反,我必须在我的 UsernamePasswordAuthenticationFilter 的构造函数中设置 AuthenticationFailureHandler ,如下所示:
public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private AuthenticationManager authenticationManager;
public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
this.setAuthenticationFailureHandler(new RestAuthenticationFailureHandler());
}
}
我希望我能用我自己的答案帮助别人。
推荐阅读
- qt - 如何在鼠标单击 QtQuick2 TableView 时获取列号
- excel - 如何使用随机数运行计算并保持返回最小增量的数字集?
- templates - Jinja2 将字典列表视为字符串
- python - 在 Keras 模型中优化准确性而不是损失
- node.js - 如何定位特定对象
- html - 如何在滚动屏幕底部修复一个容器并确保该容器是流动的?
- azure - 如何查询 Azure CosmosDB 数据库和容器的吞吐量设置?
- sql - SQL查询,当vales既是Int又是Characters时排序
- javascript - 使用 javascript 的环境变量可访问性
- llvm - LLVM 指针作为函数参数