前段時間對系統(tǒng)密碼安全性進(jìn)行了改造航夺,同時對登錄流程中的細(xì)節(jié)進(jìn)行文檔梳理互婿。比如,token生成诞吱,token校驗(yàn)田轧、續(xù)期暴匠,以及全局用戶信息存儲方式,登出和修改密碼傻粘,密碼重置需要做哪些邏輯處理每窖。
一帮掉、登錄流程圖
二、JWT 實(shí)現(xiàn)登錄認(rèn)證 + Token 自動續(xù)期
創(chuàng)建token
1.1 創(chuàng)建jwtHeader岛请;
1.2 創(chuàng)建jwtPayload旭寿,jwtPayload存放userId, uuid, clientType;
1.3 提前生成秘鑰對(RSA)崇败,生成簽名盅称;創(chuàng)建UserTokenEntity(userId,uuid后室,clientType, createTime)
緩存UserTokenEntity
3.1 字段
userId:用戶id;
expireTime = 24小時缩膝,過期時間;
clientType = APP/WEB岸霹,表示是web端還是app端疾层;
uuid:表示唯一性;
3.2 實(shí)現(xiàn)組合唯一
redisKey = userId + clientType + uuid
例如:張三的賬號可以多個終端登錄贡避,userId + clientType + uuid實(shí)現(xiàn)組合唯一痛黎,作為當(dāng)前客戶端登錄的唯一性key,同時如果需要查詢這個賬號有幾個終端登錄刮吧,可以用userId查詢湖饱。token校驗(yàn)、續(xù)期
攔截器中主要做兩件事杀捻,一是對token進(jìn)行校驗(yàn)井厌,二是判斷token是否需要進(jìn)行續(xù)期(最小續(xù)期時間:minTime = 1小時)
4.1 解析token,驗(yàn)證簽名致讥,驗(yàn)簽是否通過仅仆;
4.2 redis獲取UserTokenEntity,如果UserTokenEntity == null垢袱,token過期墓拜,需要重新登錄;
4.3 如果UserTokenEntity != null请契,驗(yàn)證是否需要續(xù)期:
token已使用時間:usedTime = now - createTime撮弧,now是當(dāng)前時間,createTime是創(chuàng)建UserTokenEntity的時間姚糊;
最大可使用時間:canUseTime = expireTime - minTime = 23;
usedTime如果小于canUseTime,說明不需要續(xù)期授舟;
usedTime如果大于canUseTime救恨,則說明需要續(xù)期,UserTokenEntity中createTime更新為當(dāng)前時間释树,UserTokenEntity中createTime更新為當(dāng)前時間肠槽,UserTokenEntity中createTime更新為當(dāng)前時間擎淤,重要的說三遍,重新緩存UserTokenEntity秸仙。
三嘴拢、其它重要關(guān)聯(lián)點(diǎn)
緩存全局的用戶信息,GlobalUserInfoEntity
UserService提供統(tǒng)一方法寂纪,參數(shù)userId席吴,查詢用戶全部信息,包括用戶捞蛋、部門孝冒、角色、菜單等信息拟杉,方法上提供緩存庄涡,24小時;登錄
先移除緩存用戶信息搬设,再查詢并更新用戶緩存信息穴店;退出登錄
刪除該用戶緩存UserTokenEntity deleteRedisKey = userId + clientType + uuid修改密碼
刪除該用戶所有客戶端緩存UserTokenEntity, 讓所有token都失效,deleteRedisKey = userId重置密碼
刪除該用戶所有客戶端緩存UserTokenEntity, 讓所有token都失效拿穴,deleteRedisKey = userId