广告
返回顶部
首页 > 资讯 > 精选 >Spring Security认证的方法是什么
  • 245
分享到

Spring Security认证的方法是什么

2023-06-28 21:06:12 245人浏览 薄情痞子
摘要

今天小编给大家分享一下spring Security认证的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

今天小编给大家分享一下spring Security认证的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

前言

本文以用户名/密码验证方式为例,讲解 Spring Security 的认证流程,在此之前,需要你了解 Spring Security 用户名/密码认证的基本配置。

Spring Security 是基于过滤器的,通过一层一层的过滤器,处理认证的流程,拦截非法请求。

认证上下文的持久化

处于最前面的过滤器叫做 SecurityContextPersistenceFilter,Spring Security 是通过 Session 来存储认证信息的,这个过滤器的 doFilter 方法在每次请求中只执行一次,作用就是,在请求时,将 Session 中的 SecurityContext 放到当前请求的线程中(如果有),在响应时,检查县城中是否有 SecurityContext,有的话将其放入 Session。可以理解为将 SecurityContext 进行 Session 范围的持久化。

认证信息的封装

接着进入 UsernamePassWordAuthenticationFilter,这是基于用户名/密码认证过程中的主角之一。

默认情况下,这个过滤器会匹配路径为 /login 的 POST 请求,也就是 Spring Security 默认的用户名和密码登录的请求路径。

这里最关键的代码是 attemptAuthentication 方法(由 doFilter 方法调用),源码如下:

@Overridepublic Authentication attemptAuthentication ( httpservletRequest request, HttpServletResponse response ) throws AuthenticationException { if ( this.postOnly && !request.getMethod () .equals ( "POST" )) { throw new AuthenticationServiceException ( "Authentication method not supported: " + request.getMethod ()) ;   } String username = obtainUsername ( request ) ;   username = ( username != null ) ? username : "";   username = username.trim () ;   String password = obtainPassword ( request ) ;   password = ( password != null ) ? password : "";   UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken ( username, password ) ;   // Allow subclasses to set the "details" property   setDetails ( request, authRequest ) ;   return this.getAuthenticationManager () .authenticate ( authRequest ) ; }

attemptAuthentication 方法代码的第 12 行,使用从 request 中获取到的用户名和密码,构建了一个 UsernamePasswordAuthenticationToken 对象,我们可以看到这个构造方法的代码,非常简单:

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

只是保存了用户名和密码的引用,并且将认证状态设置为 false,因为此时只是封装了认证信息,还没有进行认证。

我们再回到 attemptAuthentication 的代码,在方法的最后一行,将创建好的认证信息,传递给了一个 AuthenticationManager 进行认证。这里实际工作的是 AuthenticationManager 的实现类 ProviderManager

查找处理认证的 Provider 类

进入 ProviderManager 可以从源码中找到 authenticate 方法,代码比较长,我就不贴在这里了,你可以自行查找,我简述一下代码中的逻辑。

ProviderManager 本身不执行认证操作,它管理着一个 AuthenticationProvider 列表,当需要对一个封装好的认证信息进行认证操作的时候,它会将认证信息和它管理者的 Provider 们,逐一进行匹配,找到合适的 Provider 处理认证的具体工作。

可以这样理解,ProviderManager 是一个管理者,管理着各种各样的 Provider。当有工作要做的时候,它从来都不亲自去做,而是把不同的工作,分配给不同的 Provider 去操作。

最后,它会将 Provider 的工作成果(已认证成功的信息)返回,或者抛出异常。

那么,它是怎么将一个认证信息交给合适的 Provider 的呢?

在上一部分中,我们说到,认证信息被封装成了一个 UsernamePasswordAuthenticationToken,它是Authentication 的子类,ProviderManager 会将这个认证信息的类型,传递个每个 Provider 的 supports 方法,由 Provider 来告诉 ProviderManager 它是不是支持这个类型的认证信息。

认证逻辑

在 Spring Security 内置的 Provider 中,与 UsernamePasswordAuthenticationToken 对应的 Provider 是 DaoAuthenticationProviderauthenticate 方法在它的父类 AbstractUserDetailsAuthenticationProvider 中。我们来看它的 authenticate 方法:

@Overridepublic Authentication authenticate ( Authentication authentication ) throws AuthenticationException { Assert.isInstanceOf( UsernamePasswordAuthenticationToken.class, authentication,         () -> this.messages.getMessage ( "AbstractUserDetailsAuthenticationProvider.onlySupports",               "Only UsernamePasswordAuthenticationToken is supported" )) ;   String username = determineUsername ( authentication ) ;   boolean cacheWasUsed = true;   UserDetails user = this.userCache.getUserFromCache ( username ) ;   if ( user == null ) { cacheWasUsed = false;      try { user = retrieveUser ( username, ( UsernamePasswordAuthenticationToken ) authentication ) ;      } catch ( UsernameNotFoundException ex ) { this.logger.debug ( "Failed to find user '" + username + "'" ) ;         if ( !this.hideUserNotFoundExceptions ) { throw ex;         } throw new BadCredentialsException ( this.messages               .getMessage ( "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials" )) ;      } Assert.notNull( user, "retrieveUser returned null - a violation of the interface contract" ) ;   } try { this.preAuthenticationChecks.check ( user ) ;      additionalAuthenticationChecks ( user, ( UsernamePasswordAuthenticationToken ) authentication ) ;   } catch ( AuthenticationException ex ) { if ( !cacheWasUsed ) { throw ex;      } // There was a problem, so try again after checking      // we're using latest data (i.e. not from the cache)      cacheWasUsed = false;      user = retrieveUser ( username, ( UsernamePasswordAuthenticationToken ) authentication ) ;      this.preAuthenticationChecks.check ( user ) ;      additionalAuthenticationChecks ( user, ( UsernamePasswordAuthenticationToken ) authentication ) ;   } this.postAuthenticationChecks.check ( user ) ;   if ( !cacheWasUsed ) { this.userCache.putUserInCache ( user ) ;   } Object principalToReturn = user;   if ( this.forcePrincipalAsString ) { principalToReturn = user.getUsername () ;   } return createSuccessAuthentication ( principalToReturn, authentication, user ) ; }

代码比较长,我们说要点:

  • 代码第 12 行,通过 retrieveUser 方法,获得 UserDetails 信息,这个方法的具体实现,可以在 DaoAuthenticationProvider 中找到,主要是通过 UserDetailsService 的 loadUserByUsername 方法,查找系统中的用户信息。

  • 代码第 25 行,通过 preAuthenticationChecks.check 方法,进行了认证前的一些校验。校验的具体实现可以在 DefaultPreAuthenticationChecks 内部类中找到,主要是判断用户是否定、是否可用、是否过期。

  • 代码第 26 行,通过 additionalAuthenticationChecks 方法,对用户名和密码进行了校验。具体实现可以在 DaoAuthenticationProvider 中找到。

  • 代码第 39 行,通过 postAuthenticationChecks.check 方法,校验了密码是否过期。具体实现可以在 DefaultPostAuthenticationChecks 内部类中找到。

  • 最后,如果以上校验和认证都没有问题,则通过 createSuccessAuthentication 方法,创建成功的认证信息,并返回。此时,就成功通过了认证。

在最后的 createSuccessAuthentication 方法中,会创建一个新的 UsernamePasswordAuthenticationToken 认证信息,这个新的认证信息的认证状态为 true。表示这是一个已经通过的认证。

这个认证信息会返回到 UsernamePasswordAuthenticationFilter 中,并作为 attemptAuthentication 方法的结果。

doFilter 方法中,会根据认证成功或失败的结果,调用相应的 Handler 类进行后续的处理,最后,认证的信息也会被保存在 SecurityContext 中,供后续使用。

以上就是“Spring Security认证的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Spring Security认证的方法是什么

本文链接: https://www.lsjlt.com/news/321068.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Security认证的方法是什么
    今天小编给大家分享一下Spring Security认证的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-06-28
  • Spring Security认证机制是什么
    这篇“Spring Security认证机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring&nb...
    99+
    2023-07-05
  • Security登录认证的流程是什么
    这篇文章主要介绍“Security登录认证的流程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Security登录认证的流程是什么”文章能帮助大家解决问题。一、前言:流程图:二、前台发送请求用...
    99+
    2023-06-26
  • ADO.NET模型认证的方法是什么
    本篇内容主要讲解“ADO.NET模型认证的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET模型认证的方法是什么”吧!一、SqlConnection对象ADO.NET使用Sq...
    99+
    2023-06-17
  • Spring Security 密码验证动态加盐的验证处理方法
    本文个人博客地址:https://www.leafage.top/posts/detail/21697I2R 最近几天在改造项目,需要将gateway整合security在一起进行认...
    99+
    2022-11-12
  • windows下mongodb关闭认证的方法是什么
    在Windows下关闭MongoDB的身份验证方法如下:1. 打开命令提示符(CMD)或PowerShell。2. 使用cd命令导航...
    99+
    2023-08-23
    mongodb windows
  • Spring Security的登陆流程是什么
    本篇内容介绍了“Spring Security的登陆流程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Spring Security...
    99+
    2023-06-25
  • ldap认证服务器搭建的方法是什么
    LDAP(Lightweight Directory Access Protocol)认证服务器的搭建方法如下:1. 安装LDAP服...
    99+
    2023-06-14
    ldap认证
  • django认证类配置实现方法是什么
    这篇文章主要介绍“django认证类配置实现方法是什么”,在日常操作中,相信很多人在django认证类配置实现方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”django认证类配置实现方法是什么”的疑...
    99+
    2023-06-25
  • Spring Security中WebSecurity和HttpSecurity的关系是什么
    这篇文章给大家分享的是有关Spring Security中WebSecurity和HttpSecurity的关系是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前几天有粉丝私...
    99+
    2022-10-19
  • Spring Security 安全框架的原理是什么
    本篇文章给大家分享的是有关Spring Security 安全框架的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。认证授权分析用户在进行资源访问时,要求系统要对用户进...
    99+
    2023-06-20
  • Spring Security中的四种权限控制方式分别是什么
    本篇文章为大家展示了Spring Security中的四种权限控制方式分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring Security 中对于...
    99+
    2022-10-19
  • Java8的默认方法是什么
    这篇文章主要介绍了Java8的默认方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8的默认方法是什么文章都会有所收获,下面我们一起来看看吧。什么是默认方法默认方法是接口中用default修饰的方...
    99+
    2023-06-29
  • 云服务器新用户认证试用的方法是什么
    云服务器新用户认证试用的方法通常包括以下步骤:1. 注册账号:首先,用户需要在云服务器提供商的官方网站上注册一个新的账号。2. 选择...
    99+
    2023-09-27
    云服务器
  • ssl认证的流程是什么
    ssl认证的流程是:1、按照要求把证书配置到网站服务器中;2、客户端会直接向服务器发送一个接入请求;3、服务器接受到请求后,会将证书...
    99+
    2023-02-09
    ssl认证 ssl
  • python中ssl认证指的是什么
    这篇文章将为大家详细讲解有关python中ssl认证指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long...
    99+
    2023-06-14
  • spring集成kafka的方法是什么
    Spring集成Kafka的方法如下: 引入依赖:在项目的pom.xml文件中添加spring-kafka依赖。 <dep...
    99+
    2023-10-20
    spring kafka
  • spring整合mybatis的方法是什么
    Spring整合MyBatis的方法有以下几种: 使用Spring的XML配置文件进行整合: 在Spring配置文件中配置数据...
    99+
    2023-10-25
    spring mybatis
  • spring整合hibernate的方法是什么
    Spring整合Hibernate的方法有以下几种:1. 使用Spring的HibernateTemplate:Spring提供了H...
    99+
    2023-08-12
    spring hibernate
  • SpringBoot/Spring AOP默认动态代理方式是什么
    这篇文章主要介绍“SpringBoot/Spring AOP默认动态代理方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot/Spring AOP默认动态...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作