文章目录
- 前言
- 参考目录
- 框架集成
- 功能调用流程分析
- ##、流程简图(重点)
- #1、登录请求 `SysLoginController#login`
- #2、登录方法 `SysLoginService#login`
- #3、获取用户信息并校验密码是否正确 `SysLoginService#checkLogin`
- #4、构建登录用户对象 `SysLoginService#buildLoginUser`
- #5、生成 Token `LoginHelper#loginByDevice`
- #8、Sa-Token 登录方法 `StpUtil#login`
- #9、`StpLogic#login`
- #10、创建登录会话 `StpLogic#createLoginSession`(核心)
- #11、前置检查:此账号是否已被封禁 `StpLogic#isDisable`
- #12、初始化 loginModel
- #13、生成一个 Token
- #14、获取 User-Session 并续期
- #15、持久化其它数据
- #16、通知监听器账号登录成功 `UserActionListener#doLogin`
- #17、检查此账号会话数量是否超出最大值
- #18、在当前客户端注入 Token `StpLogic#setTokenValue`
- #19、设置用户数据(多级缓存)`LoginHelper#setLoginUser`
- #20、记录登录信息 `SysLogininforServiceImpl#recordLogininfor`
- #21、更新用户登录信息 `SysLoginService#recordLoginInfo`
- #22、获取用户 Token 值 `StpLogic#getTokenValue`
前言
之前已经写过一篇 Sa-Token 登录流程分析的 文章,好像那篇文章的阅读量也不算低(在本人博客专栏中),但是因为版本更新以及本人想要提高一下内容质量,所以重新写了一下分析的内容,并且加上了流程图,便于流程的梳理。
参考目录
框架集成
基于 Sa-Token 最新版本:
yaml 配置文件:
功能调用流程分析
##、流程简图(重点)
首先按照惯例,请记住这张图(后面的流程截图都是基于此):
温馨提醒,由于流程步骤较多,结合这张图走不容易迷路。
#1、登录请求 SysLoginController#login
#2、登录方法 SysLoginService#login
登录方法大致可以分为七个步骤:
- 检查验证码开关是否开启,如果开启则校验验证码是否正确。
(#2)
- 根据用户名获取用户信息;验证用户密码是否正确。
(#3)
- 构建登录用户对象。
(#4)
- 生成 Token。
(#5)
- 记录登录信息日志。
(#20)
- 更新用户登录信息。
(#21)
- 获取用户 Token 值。
(#22)
因为把验证码开关关掉了,所以这里没有进入校验方法 SysLoginService#validateCaptcha
。
#3、获取用户信息并校验密码是否正确 SysLoginService#checkLogin
如果密码错误,会记录错误次数,如果达到指定次数(默认5次)则账号会被锁定一段时间(默认10分钟)。
#4、构建登录用户对象 SysLoginService#buildLoginUser
经过步骤 #3
说明登录校验通过,可以构建登录对象。
#5、生成 Token LoginHelper#loginByDevice
该方法一共有三个步骤:
- 将用户信息存入request对象中,方便后面信息共享。
(#6)
- 调用 Sa-Token 登录方法。
(#7)
- 设置用户数据多级缓存。
(#19)
SaHolder.getStorage()
获取 request 对象:
#8、Sa-Token 登录方法 StpUtil#login
id 是 loginUser.getLoginId
方法所得,在方法内做了拼接:
#9、StpLogic#login
#10、创建登录会话 StpLogic#createLoginSession
(核心)
整个登录流程的核心方法,在源码注释中也包含了主要的流程步骤:
- 前置检查:此账号是否已被封禁。
(#11)
- 初始化 loginModel。
(#12)
- 生成一个 Token。
(#13)
- 获取 User-Session 并续期。
(#14)
- 持久化其他数据。
(#15)
- 通知监听器账号登录成功。
(#16)
- 检查此账号会话数量是否超出最大值。
(#17)
#11、前置检查:此账号是否已被封禁 StpLogic#isDisable
StpLogic#splicingKeyDisable
执行结果:
#12、初始化 loginModel
#13、生成一个 Token
StpLogicJwtForSimple#createTokenValue
SaJwtUtil#createToken
#14、获取 User-Session 并续期
前面登录了3次,此次流程是第4次。
SaSession#addTokenSign
将新的 Token 保存到集合中,并且更新缓存:
#15、持久化其它数据
// token -> id 映射关系
saveTokenToIdMapping(tokenValue, id, loginModel.getTimeout());
// 写入 [token-last-activity] :
setLastActivityToNow(tokenValue);
#16、通知监听器账号登录成功 UserActionListener#doLogin
#17、检查此账号会话数量是否超出最大值
StpLogic#logoutByMaxLoginCount
至此会话创建成功,回到上一层方法 StpLogic#login
继续执行。
#18、在当前客户端注入 Token StpLogic#setTokenValue
StpLogic#setTokenValueToStorage
Sa-Token 登录方法执行完成,回到框架登录方法设置用户多级缓存。
#19、设置用户数据(多级缓存)LoginHelper#setLoginUser
用户登录流程生成 Token 方法执行完成,继续回到主方法 SysLoginService#login
执行余下的逻辑。
#20、记录登录信息 SysLogininforServiceImpl#recordLogininfor
#21、更新用户登录信息 SysLoginService#recordLoginInfo
#22、获取用户 Token 值 StpLogic#getTokenValue
将 Token 值返回给前端,登录方法执行结束。