JWT實(shí)現(xiàn)單點(diǎn)登錄的概念
1.總結(jié):
昨天主要是了解了JWT的作用、構(gòu)成以及RSA的作用和構(gòu)成,再就是分布式認(rèn)證的流程和集中式的差別
JWT的作用:JWT用于生成和校驗(yàn)token
JWT的構(gòu)成:頭部、載荷以及簽名
頭部:設(shè)置規(guī)范信息,如簽名的編碼格式
載荷:存儲有效信息,如用戶名,用戶角色,過期時間,但是不能存儲密碼,容易泄密
簽名:將頭部和載荷通過base64編碼,再通過"."相連,加入鹽值,再使用頭部聲明的編碼格式進(jìn)行編碼,頭部跟載荷一般容易查到,系統(tǒng)的安全性體現(xiàn)在鹽上面
RSA加密:私鑰,公鑰
私鑰一般保存在認(rèn)證服務(wù)中,公鑰保存在資源服務(wù)中
當(dāng)使用私鑰加密時,需要私鑰或者公鑰解密,當(dāng)公鑰加密,只能使用私鑰解密
加密過程是在認(rèn)證中進(jìn)行的,系統(tǒng)返回給用戶的憑證就是加密后的token,解密是在用戶第二次登錄的過程中,認(rèn)證中心驗(yàn)證token的時候進(jìn)行解密
認(rèn)證流程
集中式:1)用戶認(rèn)證:首先時在UsernamePasswordAuthenticationFilter中的attemptAuthentication中進(jìn)行用戶認(rèn)證,該過濾器父類SuccessfulAuthentication中進(jìn)行認(rèn)證成功后的操作;2)身份校驗(yàn):在AuthenticationFilter的Internal方法中檢查用戶是否登陸,session中是否有用戶信息
分布式:1)用戶認(rèn)證:可接受異步認(rèn)證post請求,在successfulAuthentication認(rèn)證后將token返回給用戶;2)身份校驗(yàn):使用BasicAuthenticationFilter的doFilterInternal方法來驗(yàn)證用戶攜帶的token是否合法,并解析用戶信息
?
2.反思:昨天在思想上面沒有什么提升,在知識上面,主要就是對單點(diǎn)登錄的認(rèn)識,之前的單點(diǎn)登錄并沒有涉及到加密這個內(nèi)容,這樣更好地保護(hù)了token嗎,也就是用戶的信息,今天會編寫相關(guān)代碼
?
3.復(fù)盤:主要還是從之前的單點(diǎn)登錄出發(fā)
sso-login 包下的LoginController
//doLogin 1.首先獲取用戶登錄網(wǎng)頁,用于后面登錄成功的重定向
2.模擬數(shù)據(jù)庫獲取數(shù)據(jù)驗(yàn)證用戶登錄信息
3.登陸成功后,創(chuàng)建token,將其作為建,用戶信息作為值存儲在緩存類匯總
4.創(chuàng)建cookie,使用固定字符串作為鍵,token作為值存儲在cookie匯總, 再響應(yīng)cookie到瀏覽器,最后重定向回原登錄頁面
5.登錄失敗,通過session返回錯誤信息,返回登錄頁面
//getUserInfo
1.使用了ResponseEntity類來響應(yīng)前端, 首先是通過判斷token是否存在,如果存在,從緩存類中根據(jù)token獲取與用戶信息, 再返回OK狀態(tài),不存在返回HttpStatus.BAD_REQUEST
//logOUt
1.設(shè)置cookie時間為0
2.清楚緩存類中的token
3.響應(yīng)清除后的cookie給瀏覽器
?
sso-login 包下的ViewController
//toLogin
1.首先是判斷target是否存在,存在就判斷cookie是否存在,
再根據(jù)cookie獲取token, 判斷token是否存在,
再根據(jù)token獲取用戶信息,如果用戶信息存在,重定向回源登錄頁面
2.如果不存在target,賦值為登錄頁面
?
其他 包下的ViewController
//toIndex
1.首先判斷cookie是否存在,若存在根據(jù)cookie的值獲取token;
再根據(jù)token是否存在,若存在,則根據(jù)用戶登錄網(wǎng)址加上token獲取用戶信息,并通過 session響應(yīng)給登錄頁面
鏈接:https://www.dianjilingqu.com/530708.html