SpringSecurity5 认证流程

回到序章

来来来,点这

正文

以 spring-security5 提供的默认表单登陆为例,其大概流程如下:

  1. 终端发起登陆请求
  2. 认证过滤器 UsernamePasswordAuthenticationFilter 拦截到请求,处理认证逻辑,在这里获得登陆信息,根据获得的登陆信息创建出未认证的 Authentication( 这里对应的是 UsernamePasswordAuthenticationToken 对象 ),然后将对象交给认证管理器
  3. 认证管理器循环所有的 AuthenticationProvider,找到对应的 provider 进行认证
    3.1. 认证管理器 AuthenticationManager 维护着许多 AuthenticationProvider,这些 AuthenticationProvider 分别用来认证不同类型的请求,例如:表单、第三方 等
  4. 认证成功后,生成一个已认证的 Authentication,并将其通过 SecurityContextHolder.getContext().setAuthentication(authResult); 写到 SecurityContext

注: 以上部分其实很多都可以自定义实现扩展,不过这里不详说,后续如果有用到且有时间会作为附加篇进行补充。

相关源码定位

过滤

UsernamePasswordAuthenticationFilter

UsernamePasswordAuthenticationFilter

认证管理器匹配对应的 provider 进行认证

org.springframework.security.authentication.ProviderManager

ProviderManager

provider 进行认证

org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider-authenticate

代码太长了,把代码精简过后大概如下:

1
2
3
4
5
6
7
8
9
10
11
user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication);

// 校验用户是否冻结、删除、过期
this.preAuthenticationChecks.check(user);
// 校验密码之类的
this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication);
// 校验密码是否过期之类的
this.postAuthenticationChecks.check(user);

// 创建一个认证后的 Authentication
return this.createSuccessAuthentication(principalToReturn, authentication, user);

获得用户信息

org.springframework.security.authentication.dao.DaoAuthenticationProvider-retrieveUser

DaoAuthenticationProvider-retrieveUser

获得 UserDetails

org.springframework.security.provisioning.InMemoryUserDetailsManager-loadUserByUsername

InMemoryUserDetailsManager-loadUserByUsername

认证结束,该成功成功,该失败失败

org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter

AbstractAuthenticationProcessingFilter-登陆结果处理