说明:本文介绍在 yudao 框架中如何实现系统登录的;

登录接口

首先,找到系统的登录接口,注意接口上的 @PermitAll 注解,允许所有请求访问。

在这里插入图片描述

入参主要是用户名和密码,其他参数非必填

在这里插入图片描述

进入 Service,主要做了下面三件事

在这里插入图片描述

看登录密码的校验,根据用户名查数据库,看账户是否已存在,已存在再进行密码对比

在这里插入图片描述

这里密码比对,不是单纯地检测字符串是否相等,是用了 Spring Security 的密码器 PasswordEncoder。

数据库查出来的用户密码是密文,密码器支持用户传入明文密码与数据库密文密码比较。

在这里插入图片描述

打断点可以看到,一个是明文(传入的),一个是密文(数据库的)

在这里插入图片描述

用户校验通过后,接着发 Token。

在这里插入图片描述

发 Token 前,先记录下登录日志。

在这里插入图片描述

发 Token 这里,先生成了 Token,接着存入到数据库中

在这里插入图片描述

Token,是调用 Hutool 工具包中的 IdUtil.fastSimpleUUID() 方法生成的,也就是说 Token 就是去掉了横线的 UUID。

在这里插入图片描述

返回上级,进入 createOAuth2AccessToken(refreshTokenDO, clientDO);,这里将上面生成的 refreshToken 作为参数又生成了一个 accessToken。

与前面一样,生成 Token 的同时,也将 Token 和一些记录存入了数据库,并且还将 DO 对象存入了 Redis。

在这里插入图片描述

最终转换 DO 对象为 VO 对象返回给前端。

在这里插入图片描述

消息体如下,有两个 Token,用户ID和 Token 有效期,注意这里的有效期是指 accessToken 的。
在这里插入图片描述

双Token设计

为什么 yudao 框架中登录返回了两个 Token ?回答这个问题前,先说下单 Token 有什么不好的地方?

(1)单 Token 不安全,Token 是一串字符串,被其他人复制了可以代替用户操作系统;

(2)无法主动使 Token 失效,例如 Token 有效期是三十天,用户在第三天被禁止登录了,但 Token 仍有效,无法使其失效;


双 Token 就能解决上面两个问题,双 Token 是在登录时,生成两个有效期不一样 Token,分别使用,如下:

  • access_token:每次请求时携带,有效期短,如10分钟、30分钟;

  • refresh_token:当 access_token 失效时,携带此 token 验证,验证成功后,发放新的双 Token,只使用一次,有效期长,如30天;

具体流程如下:

在这里插入图片描述

整套流程叫做:双 Token + 三验证

当 access_token 失效时,前端会调用后端这个接口,生成新的双 Token,当这个校验不通过时会要求用户重新登录。

在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐