yudao中的登录实现(双Token)
说明:本文介绍在 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,当这个校验不通过时会要求用户重新登录。

更多推荐
所有评论(0)