Spring Security 认证过程详解

一、认证流程图

  假设系统当前没有任何用户登录且没有任何的用户缓存。认证流程如下图所示:

在这里插入图片描述

二、过程详解

  1) 用户发起表单验证后,首先会被UsernamePasswordAuthenticationFilter捕获。

在这里插入图片描述
  UsernamePasswordAuthenticationFilter中根据用户表单信息中的用户名和密码构建UsernamePasswordAuthenticationToken,并将其交给AuthenticationManager实现认证过程。

  但在大部分情况下,我们会在自定义的表单处理接口中构建UsernamePasswordAuthenticationToken,然后通过authenticationManagerBuilder.getObject()获得AuthenticationManager,进而实现认证流程。

  UsernamePasswordAuthenticationToken及其类图继承关系如下所示:

在这里插入图片描述
在这里插入图片描述
  此外,AuthenticationManager本身不包含任何的认证逻辑,其核心是管理所有的AuthenticationProvider,本质上是由AuthenticationProvider来实现认证。

  2) 然后到ProviderManager,该类是AuthenticationManager的实现类,负责管理AuthenticationProvider,每一种AuthenticationProvider表示一种认证逻辑(Spring Security 支持多种认证逻辑)

在这里插入图片描述
  通过ProviderManagerauthenticate()方法进一步实现认证过程,如下图所示:

在这里插入图片描述
  通过getProviders().iterator()得到含AuthenticationProvider的迭代器,并通过provider.supports()方法判断当前的AuthenticationProvider是否支持当前的认证逻辑。若支持,接下来交由AbstractUserDetailsAuthenticationProviderauthenticate()实现进一步的认证。

  3) 接下来的信息认证是交给AuthenticationProvider的抽象类AbstractUserDetailsAuthenticationProvider来实现,实现方法主要是authenticate()

在这里插入图片描述
   由 DaoAuthenticationProvider实现retrieveUser()方法,如下所示:

在这里插入图片描述
  4) 成功获得UserDetails后,开始进行一系列的认证:

在这里插入图片描述
  用户身份信息的认证校验会经过前置校验、额外校验和后置校验。若所有的认证校验均通过会调用createSuccessAuthentication()方法并返回认证信息,否则会抛出响应的异常来说明认证不通过。

  createSuccessAuthentication()方法的调用过程如下所示:

在这里插入图片描述
  在该方法中重新创建了UsernamePasswordAuthenticationToken,且此时用户身份已认证通过,所以将authorities注入,并设置authenticatedtrue,即已认证。

  5) 最后认证信息会传回UsernamePasswordAuthenticationFilter,并在其父类AbstractAuthenticationProcessingFilterdoFilter()中,根据认证的成功或失败调用相应的handler

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值