前段时间对系统密码安全性进行了改造,同时对登录流程中的细节进行文档梳理。比如,token生成,token校验、续期,以及全局用户信息存储方式,登出和修改密码,密码重置需要做哪些逻辑处理。
一、登录流程图
1.登录-流程图.jpg
二、JWT 实现登录认证 + Token 自动续期
-
创建token
1.1 创建jwtHeader;
1.2 创建jwtPayload,jwtPayload存放userId, uuid, clientType;
1.3 提前生成秘钥对(RSA),生成签名; -
创建UserTokenEntity(userId,uuid,clientType, createTime)
-
缓存UserTokenEntity
3.1 字段
userId:用户id;
expireTime = 24小时,过期时间;
clientType = APP/WEB,表示是web端还是app端;
uuid:表示唯一性;
3.2 实现组合唯一
redisKey = userId + clientType + uuid
例如:张三的账号可以多个终端登录,userId + clientType + uuid实现组合唯一,作为当前客户端登录的唯一性key,同时如果需要查询这个账号有几个终端登录,可以用userId查询。 -
token校验、续期
拦截器中主要做两件事,一是对token进行校验,二是判断token是否需要进行续期(最小续期时间:minTime = 1小时)
4.1 解析token,验证签名,验签是否通过;
4.2 redis获取UserTokenEntity,如果UserTokenEntity == null,token过期,需要重新登录;
4.3 如果UserTokenEntity != null,验证是否需要续期:
token已使用时间:usedTime = now - createTime,now是当前时间,createTime是创建UserTokenEntity的时间;
最大可使用时间:canUseTime = expireTime - minTime = 23;
usedTime如果小于canUseTime,说明不需要续期;
usedTime如果大于canUseTime,则说明需要续期,UserTokenEntity中createTime更新为当前时间,UserTokenEntity中createTime更新为当前时间,UserTokenEntity中createTime更新为当前时间,重要的说三遍,重新缓存UserTokenEntity。
三、其它重要关联点
-
缓存全局的用户信息,GlobalUserInfoEntity
UserService提供统一方法,参数userId,查询用户全部信息,包括用户、部门、角色、菜单等信息,方法上提供缓存,24小时; -
登录
先移除缓存用户信息,再查询并更新用户缓存信息; -
退出登录
删除该用户缓存UserTokenEntity deleteRedisKey = userId + clientType + uuid -
修改密码
删除该用户所有客户端缓存UserTokenEntity, 让所有token都失效,deleteRedisKey = userId -
重置密码
删除该用户所有客户端缓存UserTokenEntity, 让所有token都失效,deleteRedisKey = userId













网友评论