自定义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

(0)

相关推荐

  • Spring Boot Security配置教程

    1.简介 在本文中,我们将了解Spring Boot对spring Security的支持. 简而言之,我们将专注于默认Security配置以及如何在需要时禁用或自定义它. 2.默认Security设置 为了增加Spring Boot应用程序的安全性,我们需要添加安全启动器依赖项: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • SpringBoot安全认证Security的实现方法

    一.基本环境搭建 父pom依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> </parent> 1. 添加pom依赖: <dependency> <groupId&

  • 如何使用Spring Security手动验证用户的方法示例

    1.概述 在这篇快速文章中,我们将 重点介绍如何以编程方式在Spring Security和Spring MVC中设置经过身份验证的用户 . 2. Spring Security 简而言之, Spring Security在ThreadLocal中保存每个经过身份验证的用户的主要信息 - 保存的是Authentication对象 . 为了构造和设置此Authentication对象, 通常我们需要使用Spring Security在标准身份验证上构建对象的相 同方法. 要让我们手动触发身份验证,

  • 使用Spring Security控制会话的方法

    1.概述 在本文中,我们将说明Spring Security如何允许我们控制HTTP会话.此控件的范围从会话超时到启用并发会话和其他高级安全配置. 2.会话何时创建? 我们可以准确控制会话何时创建以及Spring Security如何与之交互: •always - 如果一个会话尚不存在,将始终创建一个会话 •ifRequired - 仅在需要时创建会话(默认) •never - 框架永远不会创建会话本身,但如果它已经存在,它将使用一个 •stateless - Spring Security不会

  • 深入浅析Spring Security5中默认密码编码器

    1.概述 在Spring Security 4中,可以使用内存中身份验证以纯文本格式存储密码. 对版本5中的密码管理过程进行了重大改进,为密码编码和解码引入了更安全的默认机制.这意味着如果您的Spring应用程序以纯文本格式存储密码,升级到Spring Security 5可能会导致问题. 在这个简短的教程中,我们将描述其中一个潜在的问题,并展示该问题的解决方案. 2. Spring Security 4 我们首先展示一个标准的安全配置,它提供简单的内存中身份验证(适用于Spring 4): @

  • Spring Security在标准登录表单中添加一个额外的字段

    概述 在本文中,我们将通过向标准登录表单添加额外字段来实现Spring Security的自定义身份验证方案. 我们将重点关注两种不同的方法,以展示框架的多功能性以及我们可以使用它的灵活方式. 我们的第一种方法是一个简单的解决方案,专注于重用现有的核心Spring Security实现. 我们的第二种方法是更加定制的解决方案,可能更适合高级用例. 2. Maven设置 我们将使用Spring Boot启动程序来引导我们的项目并引入所有必需的依赖项.  我们将使用的设置需要父声明,Web启动器和安

  • 浅谈Spring Security LDAP简介

    1.概述 在本快速教程中,我们将学习如何设置Spring Security LDAP. 在我们开始之前,了解一下LDAP是什么? - 它代表轻量级目录访问协议.它是一种开放的,与供应商无关的协议,用于通过网络访问目录服务. 2. Maven Dependency 首先,让我们看看我们需要的maven依赖项: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spr

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

    1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authentication and Authorization) 身份验证和授权通常结合使用,因为它们在授予系统访问权限时起着重要且同样重要的作用. 但是,它们具有不同的含义,并在验证请求时应用不同的约束: 身份验证 - 在授权之前;它是关于验证收到的凭证;我们验证用户名和密码是否与我们的应用程序识别的用户

  • Spring Security跳转页面失败问题解决

    这篇文章主要介绍了Spring Security跳转页面失败问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天新建SpringBoot项目练手,第一次添加了Spring Security.成功启动项目后发现与之前新建的项目有点不一样,无论我怎么设置系统首页,浏览器内打开的都是登陆界面,如图: 无论我怎么设置controller的跳转路径都不起作用,气到挠头!!! 经过查阅各种资料发现可能是Spring Security权限控制的原因,

  • Spring Security实现接口放通的方法详解

    目录 1.SpringBoot版本 2.实现思路 3.实现过程 3.1新建注解 3.2新建请求枚举类 3.3判断Controller方法上是否存在该注解 3.4在SecurityConfig上进行策略的配置 3.5在Controller方法上应用 3.6效果展示 在用Spring Security项目开发中,有时候需要放通某一个接口时,我们需要在配置中把接口地址配置上,这样做有时候显得麻烦,而且不够优雅.我们能不能通过一个注解的方式,在需要放通的接口上加上该注解,这样接口就能放通了.答案肯定是可

  • Spring Security 中细化权限粒度的方法

    有小伙伴表示微人事(https://github.com/lenve/vhr)的权限粒度不够细.不过松哥想说的是,技术都是相通的,明白了 vhr 中权限管理的原理,在此基础上就可以去细化权限管理粒度,细化过程和还是用的 vhr 中用的技术,只不过设计层面重新规划而已. 当然今天我想说的并不是这个话题,主要是想和大家聊一聊 Spring Security 中权限管理粒度细化的问题.因为这个问题会涉及到不同的权限管理模型,今天和小伙伴们聊一聊- 1.权限管理模型 要想将细化权限粒度,我们不可避免会涉

  • java中自定义Spring Security权限控制管理示例(实战篇)

    背景描述 项目中需要做细粒的权限控制,细微至url + httpmethod (满足restful,例如: https://.../xxx/users/1, 某些角色只能查看(HTTP GET), 而无权进行增改删(POST, PUT, DELETE)). 表设计 为避嫌,只列出要用到的关键字段,其余敬请自行脑补. 1.admin_user 管理员用户表, 关键字段( id, role_id ). 2.t_role 角色表, 关键字段( id, privilege_id ). 3.t_privi

  • Spring Security 强制退出指定用户的方法

    应用场景 最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑! 社区的安全框架使用了 spring-security 和 spring-session,登录状态 30 天有效,session 信息是存在 redis 中,如何优雅地处理这些不老实的用户呢? 首先,简单划分下用户的权限: 管理员(ROLE_MANAGER):基本操作 + 管理操作 普通用户(ROLE_USER):基本操作 拉黑用户(ROLE_BLACK):不允许登录 然后,拉黑指定用户(ROLE

  • Spring Security内置过滤器的维护方法

    目录 内置过滤器的顺序 注册过滤器的逻辑 获取已注册过滤器的顺序值 HttpSecurity维护过滤器的方法 addFilterAtOffsetOf addFilter系列方法 问题来了 Spring Security中的内置过滤器顺序是怎么维护的?我想很多开发者都对这个问题感兴趣.本篇我和大家一起探讨下这个问题. HttpSecurity包含了一个成员变量FilterOrderRegistration,这个类是一个内置过滤器注册表.至于这些过滤器的作用,不是本文介绍的重点,有兴趣可以去看看Fi

  • Spring security BCryptPasswordEncoder密码验证原理详解

    一.加密算法和hash算法的区别 加密算法是一种可逆的算法,基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为"密文",但在用相应的密钥进行操作之后就可以得到原来的内容 . 哈希算法是一种不可逆的算法,是把任意长度的输入通过散列算法变换成固定长度的输出,输出就是散列值,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值. 二.源码解析 BCryptPasswordEncoder类实现了PasswordEncoder接口,这个接口中定义

  • 浅析Spring Security登录验证流程源码

    一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringSecurity提供了多种登录认证的方式,由多种Filter过滤器来实现,比如: BasicAuthenticationFilter实现的是HttpBasic模式的登录认证 UsernamePasswordAuthenticationFilter实现用户名密码的登录认证 RememberMeAuthe

  • Spring security自定义用户认证流程详解

    1.自定义登录页面 (1)首先在static目录下面创建login.html 注意:springboot项目默认可以访问resources/resources,resources/staic,resources/public目录下面的静态文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</titl

随机推荐