自定义SpringSecurity的身份验证失败怎么办
创始人
2024-12-21 08:21:19
0次

1.概述

在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理。目标是使用表单登录方法对用户进行身份验证。

2.认证和授权(Authentication and Authorization)

身份验证和授权通常结合使用,因为它们在授予系统访问权限时起着重要且同样重要的作用。

但是,它们具有不同的含义,并在验证请求时应用不同的约束:

身份验证 - 在授权之前;它是关于验证收到的凭证;我们验证用户名和密码是否与我们的应用程序识别的用户名和密码相匹配授权 - 用于验证成功通过身份验证的用户是否有权访问应用程序的某个功能

我们可以自定义身份验证和授权失败处理,但是,在此应用程序中,我们将专注于身份验证失败。

3. Spring Security的AuthenticationFailureHandler

Spring Security提供了一个默认处理身份验证失败的组件。

但是,我们发现于默认行为不足以满足实际要求的情况是很常见的。

如果是这种情况,我们可以创建自己的组件并通过实现AuthenticationFailureHandler接口提供我们想要的自定义行为:

public class CustomAuthenticationFailureHandler  implements AuthenticationFailureHandler {   private ObjectMapper objectMapper = new ObjectMapper();   @Override  public void onAuthenticationFailure(   HttpServletRequest request,   HttpServletResponse response,   AuthenticationException exception)    throws IOException, ServletException {     response.setStatus(HttpStatus.UNAUTHORIZED.value());    Map data = new HashMap<>();    data.put(     "timestamp",      Calendar.getInstance().getTime());    data.put(     "exception",      exception.getMessage());     response.getOutputStream()     .println(objectMapper.writeValueAsString(data));  }}

默认情况下,Spring使用包含错误信息的请求参数将用户重定向回登录页面。

在此应用程序中,我们将返回401响应,其中包含有关错误的信息以及错误发生的时间戳。

DelegatingAuthenticationFailureHandler将AuthenticationException子类委托给不同的AuthenticationFailureHandler,这意味着我们可以为AuthenticationException的不同实例创建不同的行为  ExceptionMappingAuthenticationFailureHandler根据AuthenticationException的完整类名将用户重定向到特定的URL  无论AuthenticationException的类型如何,ForwardAuthenticationFailureHandler都会将用户转发到指定的URL  SimpleUrlAuthenticationFailureHandler是默认使用的组件,如果指定,它会将用户重定向到failureUrl;否则,它只会返回401响应

现在我们已经创建了自定义AuthenticationFailureHandler,让我们配置我们的应用程序并覆盖Spring的默认处理程序:

@Configuration@EnableWebSecuritypublic class SecurityConfiguration  extends WebSecurityConfigurerAdapter {   @Override  protected void configure(AuthenticationManagerBuilder auth)    throws Exception {    auth     .inMemoryAuthentication()     .withUser("baeldung")     .password("baeldung")     .roles("USER");  }   @Override  protected void configure(HttpSecurity http)    throws Exception {    http     .authorizeRequests()     .anyRequest()     .authenticated()     .and()     .formLogin()     .failureHandler(customAuthenticationFailureHandler());  }   @Bean  public AuthenticationFailureHandler customAuthenticationFailureHandler() {    return new CustomAuthenticationFailureHandler();  }}

注意failureHandler()调用,我们可以告诉Spring使用我们的自定义组件而不是使用默认组件。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...