您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

深入理解Spring Security认证流程

时间:2023-07-16 11:10:38  来源:  作者:Java学研大本营

Spring Security 是一个功能强大的框架,用于保护 Spring 应用程序。它专注于身份验证和授权,并可根据需求进行配置和自定义。本文将讨论用于身份验证的不同组件,在实际应用中,了解身份验证组件的概念对于使用 Spring Security 进行实现和自定义非常有帮助。

1 没有使用 Spring Security

如果我们没有使用 Spring Security,那么请求将被 DispatcherServlet 拦截。DispatcherServlet 是前端控制器,它拦截任何 HTTP 请求并将其转发到正确的控制器。在 Spring Boot 中,DispatcherServlet 会被自动配置。

请求会被 DispatcherServlet 拦截

2 DispatcherServlet 是如何工作的

在深入了解 Spring Security 之前,让我们先了解一下 DispatcherServlet 如何分发请求。当我们在一个端点(比如 /helloworld)发出请求时,前端控制器(DispatcherServlet)会如何处理它?

DispatcherServlet 创建了一个 IOC 容器,它是 Spring Framework 的核心组件之一,用于管理 bean 的创建和依赖关系。DispatcherServlet 创建的是 WebApplicationContext,这是一个专门用于 Web 应用程序的 IOC 容器。WebApplicationContext 是根据配置文件由 DispatcherServlet 进行配置的。

IOC 容器会创建控制器 bean 的实例。当请求到达时,DispatcherServlet 会使用 IOC 容器查找适当的控制器 bean,并委托给它来处理请求。

3 使用 Spring Security

当将 Spring Security 添加到 Spring Boot 应用程序中时,所有请求在到达 DispatcherServlet 和控制器之前都会被 Spring Security 机制拦截。

每当一个请求到达应用程序时,它首先被一系列过滤器拦截,这些过滤器称为 Filter ChAIn。除了 Spring Security 提供的过滤器之外,我们还可以添加自己的自定义过滤器。认证后的 FilterChain 将请求转发到 DisptacherServlet。

过滤器链拦截传入请求

4 认证流程:步骤

身份验证请求和响应

虽然 Spring Security 可以与不同类型的身份验证方法一起使用,但在本文中,我们讨论的是用户名和密码身份验证,以便深入了解完整的身份验证流程。

  • Filter Chain 在将请求转发给 Dispatcher Servlet 之前拦截传入请求。
  • 请求进入认证过滤器(其中一个过滤器是 UsernamePasswordAuthenticationFilter)。
  • 过滤器从请求(HttpServletRequest 对象)中提取用户名和密码。
  • 然后使用凭据创建 UsernamePasswordAuthenticationToken。
  • 调用 AuthenticationManager 的 authenticate() 方法。
  • AuthenticationManager 的 authenticate() 方法实现将尝试使用其拥有的 AuthenticationProvider 之一进行身份验证。
  • 如果一个身份验证提供程序能够成功进行身份验证,它将返回一个包含凭据和权限的完整的 UsernamePasswordAuthenticationToken。
  • 提供程序返回的此令牌用于在 Spring Security 上下文中将用户设置为已认证。
  • 一旦用户通过身份验证,请求就会被转发到处理请求的 DispatcherServlet。

5 身份验证流程的不同组件

我们了解一下前面部分讨论的不同组件。

5.1 什么是过滤器

Spring Filter 是一个组件,可以拦截任何传入请求,并在将其传递给 DispatcherServlet 之前执行某些操作。过滤器可以处理请求,然后将其转发到 Filter Chain 中的下一个过滤器,或者可以停止并发送回 HTTP 响应。其中一个过滤器是存在于 FilterChain 中的 UsernamePasswordAuthenticationFilter。此过滤器尝试查找 HTTP Post 请求中传递的用户名和密码,如果找到,则尝试使用凭据对用户进行身份验证。以下是此类中存在的身份验证方法的快照。

我们可以创建自己的 Filter 并将其添加到 SecurityFilterChain 中,以提供自己的逻辑来处理请求。

5.2 什么是 AuthenticationManager

AuthenticationManager 是一个接口,用于处理身份验证的过程。它只有一个方法 authenticate(Authentication authentication),该方法将一个身份验证对象作为参数,并返回已经认证的身份验证对象。身份验证对象通常是一个包含用户名和密码等凭据的 AuthenticationToken 对象。

Authentication authenticate(Authentication authentication) throws AuthenticationException;

AuthenticationManager 的实现类是 ProviderManager 类,它提供了 authenticate() 方法的逻辑。我们可以提供我们自己的 AuthenticationProvider 实现类或使用默认实现。

5.3 什么是 ProviderManager

该类实现了 AuthenticationManager 接口并覆盖了 authenticate() 方法。它使用一组 AuthenticationProvider 来验证 Authentication 对象中发送的凭据。如果 AuthenticationProvider 支持身份验证类型,则将用于验证用户。如果没有提供者支持身份验证类型,则将抛出 AuthenticationException。

每个身份验证提供程序的 supports() 方法用于检查它是否可以支持所需的身份验证类型。

5.4 什么是 AuthenticationProvider

AuthenticationProvider 是一个接口,用于定义验证用户的协议。它负责接收 Authentication 对象(表示用户凭据)并返回已经认证的 Authentication 对象,如果凭据有效。如果凭据无效,则 AuthenticationProvider 应该抛出 AuthenticationException。

AuthenticationProvider 接口有两个方法:

  • authenticate():此方法接受 Authentication 对象作为输入,并在凭据有效时返回已认证的 Authentication 对象。如果凭据无效,则 AuthenticationProvider 应该抛出 AuthenticationException。
  • supports():此方法接受 Authentication 对象作为输入,并且如果 AuthenticationProvider 可以验证该对象,则返回 true。如果 AuthenticationProvider 无法验证该对象,则应返回 false。

Spring Security 中的默认 AuthenticationProvider 是 DaoAuthenticationProvider。此提供程序使用 UserDetailsService 从数据库加载用户详细信息。如果用户凭据与数据库中的详细信息匹配,则 DaoAuthenticationProvider 将返回已经认证的 Authentication 对象。

我们可以添加我们自己的 AuthenticationProvider 实现来提供不同的身份验证方法。

5.5 身份验证和 UsernamePasswordAuthenticationToken

Authentication 和 UsernamePasswordAuthenticationToken 是什么?

  • Authentication

这是 Spring Security 中的一个接口,表示传入身份验证请求的令牌或已认证的主体(表示一个实体,比如个人)AuthenticationManager.authenticate() 方法。

提供的一些方法为:

Collection<? extends GrantedAuthority> getAuthorities();
 Object getCredentials();
 boolean isAuthenticated();
 void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
  • UsernamePasswordAuthenticationToken

此类扩展了 AbstractAuthenticationToken 类(身份验证对象的基类),可用于用户名/密码身份验证请求。

此类有两个构造函数:

public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
    super((Collection)null);
    this.principal = principal;
    this.credentials = credentials;
    this.setAuthenticated(false);
}

public UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
    super(authorities);
    this.principal = principal;
    this.credentials = credentials;
    super.setAuthenticated(true);
}

第一个构造函数可用于传入请求以创建未经身份验证的 Authentication 对象。

Authentication authentication = new UsernamePasswordAuthenticationToken(username,password);

第二个构造函数可用于创建完全经过身份验证的 Authentication 对象。

Authentication authToken = new UsernamePasswordAuthenticationToken(username, password, userAuthorities);

然后,此完全经过身份验证的 Authentication 对象从 AuthenticationProvider/AuthenticationManager 返回并表示已认证的用户。然后将此已认证的对象设置在 SecurityContext 中。Spring Security 中的 SecurityContext 是当前执行线程的安全上下文的表示。它包含有关当前已认证用户的信息,例如其用户名、权限和会话信息。

6 总结

本文提供了身份验证流程的简要描述,以及设置身份验证所需的不同组件。任何想要使用 Spring Security 的人在进行更多自定义和实现之前,必须清楚了解这些概念。



Tags:Spring Security   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
Spring Security 是一个功能强大的框架,用于保护 Spring 应用程序。它专注于身份验证和授权,并可根据需求进行配置和自定义。本文将讨论用于身份验证的不同组件,在实际应用中,了...【详细内容】
2023-07-16  Tags: Spring Security  点击:(0)  评论:(0)  加入收藏
前言相信大家在网上冲浪都遇到过登录时输入图片验证码的情况,既然我们已经学习了 Spring Security,也上手实现过几个案例,那不妨来研究一下如何实现这一功能。首先需要明确的是...【详细内容】
2022-12-12  Tags: Spring Security  点击:(125)  评论:(0)  加入收藏
Spring Security提供了对身份验证的全面支持。架构组件下面描述Spring Security在Servlet身份验证中使用的主要架构组件。 SecurityContextHolder:SecurityContextHolder是Sp...【详细内容】
2022-09-14  Tags: Spring Security  点击:(543)  评论:(0)  加入收藏
Spring Security是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架 Shiro ,它提供了更丰富的功能,社区资源也比Shiro丰富。一般来说中大型的项目都是使用 SpringSe...【详细内容】
2022-07-21  Tags: Spring Security  点击:(204)  评论:(0)  加入收藏
什么是CSRF攻击?了解CSRF攻击的最佳方法是看一个具体示例。 例子假设您银行的网站提供了一种表格,该表格允许将资金从当前登录的用户转移到另一个银行帐户。例如,转账表单可能...【详细内容】
2021-01-15  Tags: Spring Security  点击:(493)  评论:(0)  加入收藏
有小伙伴表示微人事(https://github.com/lenve/vhr)的权限粒度不够细。不过松哥想说的是,技术都是相通的,明白了 vhr 中权限管理的原理,在此基础上就可以去细化权限管理粒度,细...【详细内容】
2020-09-29  Tags: Spring Security  点击:(180)  评论:(0)  加入收藏
上次有小伙伴建议,源码分析太枯燥了,要是能够结合设计模式一起来,这样更有助于大家理解 Spring Security 源码,同时还能复习一波设计模式。因此松哥今天就试着整一篇,和大家来聊...【详细内容】
2020-07-31  Tags: Spring Security  点击:(206)  评论:(0)  加入收藏
CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。 @pdaiCSRF 简介CSRF(Cros...【详细内容】
2020-01-08  Tags: Spring Security  点击:(331)  评论:(0)  加入收藏
一、什么是Spring Security?Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的实际标准。Spring Security是一个框架,...【详细内容】
2019-12-25  Tags: Spring Security  点击:(388)  评论:(0)  加入收藏
今天要和小伙伴们聊一聊 Spring Security 中的另外一个问题,那就是在 Spring Security 中未获认证的请求默认会重定向到登录页,但是在前后端分离的登录中,这个默认行为则显得非...【详细内容】
2019-10-12  Tags: Spring Security  点击:(664)  评论:(0)  加入收藏
▌简易百科推荐
作者 | David Linthicum策划 | 言征 从数据可用性、安全性到模型选择和监控,生成式AI的加入便意味着要重新审视云架构。 所以,如果在构建一个云架构同时也在设计生成式AI驱动...【详细内容】
2023-09-13  David Linthicum    Tags:云架构   点击:(1)  评论:(0)  加入收藏
本文主要介绍BSTS模型原理以及CausalImpact对模型的代码实现,旨在面对一些具有特定周期性特点的数据时,更精准科学地进行因果效应值的估计。作者简介Yiwen,携程数据分析师,专注...【详细内容】
2023-09-12  携程技术    Tags:结构模型   点击:(3)  评论:(0)  加入收藏
人工智能(AI)和机器学习(Machine Learning)的崛起正在深刻地改变着各行各业。随着数据量的不断增大和计算能力的提升,利用AI和机器学习来做出智能决策已经成为企业和组织的关键战...【详细内容】
2023-09-11  高级互联网架构    Tags:架构   点击:(3)  评论:(0)  加入收藏
在这个程序中我们还可以让这个程序成为一个受应用服务管理的Servlet程序。可以将注解改成@WebServlet("/others/servlet")。只是换成这个注解还并不能生效,还需要在启动类(任...【详细内容】
2023-09-08  Springboot实战案例锦集    Tags:Spring   点击:(4)  评论:(0)  加入收藏
1.背景小红书是以年轻人为主的生活记录、分享平台,用户可以通过短视频、图文等形式记录生活点滴,分享生活方式。在小红书的社交领域里,我们有用户、笔记、商品等实体,这些实体之...【详细内容】
2023-09-08    小红书技术REDtech  Tags:REDtao   点击:(9)  评论:(0)  加入收藏
开发环境:JDK1.8+SpringBoot2.4.12+Oracle这里我们假设要使用两个数据源分别为:master和slave。 pom.xml 依赖包<dependencies> <dependency> <groupId>org.springframe...【详细内容】
2023-09-07    Springboot实战案例锦集  Tags:SpringBoot   点击:(8)  评论:(0)  加入收藏
前言本文主要是简单的讲述了Spring的事件机制,基本概念,讲述了事件机制的三要素事件、事件发布、事件监听器。如何实现一个事件机制,应用的场景,搭配@Async注解实现异步的操作等...【详细内容】
2023-09-07      Tags:Spring   点击:(11)  评论:(0)  加入收藏
作者 | 波哥审校 | 重楼在当今互联网时代,技术的发展日新月异。为了满足用户对高性能、高并发、高可靠性的需求,开发人员必须不断探索新的编程范式和架构。在这方面,异步编程和...【详细内容】
2023-09-06    51CTO  Tags:异步编程   点击:(24)  评论:(0)  加入收藏
1 Scope作用通过@Scope注解可以指定Bean的作用域,默认情况都是单例的( ConfigurableBeanFactory.SCOPE_SINGLETON=singleton)在创建bean实例时就是根据当前定义BeanDefinition...【详细内容】
2023-09-05  Springboot实战案例锦集    Tags:Spring   点击:(21)  评论:(0)  加入收藏
大家好,我是不才陈某~今天这篇文章分享一下微服务架构路线,希望对大家有所帮助~我为什么选择微服务架构?图片Java技术指南:https://java-family.cn众所周知,单体应用程序,由于其种...【详细内容】
2023-09-05  码猿技术专栏  微信公众号  Tags:架构   点击:(22)  评论:(0)  加入收藏
站内最新
站内热门
站内头条