自定义Spring Security的身份验证失败处理方法

 更新时间:2019年05月30日 16:15:27   投稿:laozhang  
在本篇文章里小编给大家整理了一篇关于自定义Spring Security的身份验证失败的处理方法,有需要的朋友们学习下。

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<String, Object> 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
@EnableWebSecurity
public 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使用我们的自定义组件而不是使用默认组件。

4.结论

在此示例中,我们使用Spring的AuthenticationFailureHandler接口自定义了应用程序的身份验证失败处理程序。

github源码:https://github.com/eugenp/tutorials/tree/master/spring-security-mvc-login

相关文章

  • java基于socket传输zip文件功能示例

    java基于socket传输zip文件功能示例

    这篇文章主要介绍了java基于socket传输zip文件功能,结合实例形式分析了java使用socket进行文件传输的具体操作步骤与服务器端、客户端相关实现技巧,需要的朋友可以参考下
    2017-07-07
  • @RereshScope刷新的原理详解

    @RereshScope刷新的原理详解

    在配合配置中心修改配置让应用自动刷新配置时,我们要在需要感知配置变化的bean上面加上@RereshScope。如果我们不加上这注解,那么有可能无法完成配置自动刷新。本文就来和大家讲讲@RereshScope刷新的原理,需要的可以参考一下
    2022-12-12
  • Java实现AOP功能的封装与配置的小框架实例代码

    Java实现AOP功能的封装与配置的小框架实例代码

    这篇文章主要介绍了Java实现AOP功能的封装与配置的小框架实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 简单了解SpringCloud运行原理

    简单了解SpringCloud运行原理

    这篇文章主要介绍了简单了解SpringCloud运行原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Spring Boot中@Validated注解不生效问题汇总大全

    Spring Boot中@Validated注解不生效问题汇总大全

    这篇文章主要给大家介绍了关于Spring Boot中@Validated注解不生效问题汇总的相关资料,@Validated注解是Spring框架中的一个注解,用于在方法参数上添加参数校验规则,需要的朋友可以参考下
    2023-07-07
  • 详解Java数组扩容缩容与拷贝的实现和原理

    详解Java数组扩容缩容与拷贝的实现和原理

    这篇文章主要带大家学习数组的扩容、缩容及拷贝,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • idea如何配置javafxsdk详细教程

    idea如何配置javafxsdk详细教程

    这篇文章主要介绍了idea如何配置javafxsdk,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习火锅工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • windows下 jdk1.7安装教程图解

    windows下 jdk1.7安装教程图解

    java编程的初学者在开始编码前都会遇到一个难题,那就是jdk1.7环境变量配置怎么操作,怎么安装,针对这个难题,小编特地为大家整理相关教程,不了解的朋友可以前往查看使用
    2018-05-05
  • JAVA学习之一步步搭建spring框架

    JAVA学习之一步步搭建spring框架

    这篇文章主要介绍了JAVA学习之一步步搭建spring框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 使用Java实现6种常见负载均衡算法

    使用Java实现6种常见负载均衡算法

    Java负载均衡算法也是分布式系统中的重要组成部分,用于将来自客户端的请求分配到不同的后端服务器上,本文将介绍常见的Java负载均衡算法,轮询法、加权随机法……一次性让你了解 6 种常见负载均衡算法
    2023-06-06

最新评论