面試:第十章:?jiǎn)吸c(diǎn)登錄
單點(diǎn)登錄業(yè)務(wù)介紹
早期單一服務(wù)器,用戶認(rèn)證
缺點(diǎn):?jiǎn)吸c(diǎn)性能壓力,無(wú)法擴(kuò)展
WEB應(yīng)用集群,session共享模式
解決了單點(diǎn)性能瓶頸。
問(wèn)題:
多業(yè)務(wù)分布式數(shù)據(jù)獨(dú)立管理,不適合統(tǒng)一維護(hù)一份session數(shù)據(jù)。
分布式按業(yè)務(wù)功能切分,用戶、認(rèn)證解耦出來(lái)單獨(dú)統(tǒng)一管理。
cookie中使用jsessionId 容易被篡改、盜取。
跨頂級(jí)域名無(wú)法訪問(wèn)。
NQ
分布式,SSO(single sign on)模式
解決 :
用戶身份信息獨(dú)立管理,更好的分布式管理。
可以自己擴(kuò)展安全策略
跨域不是問(wèn)題
缺點(diǎn):
認(rèn)證服務(wù)器訪問(wèn)壓力較大。
業(yè)務(wù)流程圖
認(rèn)證中心模塊(oauth認(rèn)證)
數(shù)據(jù)庫(kù)表:user_info,并添加一條數(shù)據(jù)!密碼應(yīng)該是加密的!
在設(shè)計(jì)密碼加密方式時(shí) 一般是使用MD5+鹽的方式進(jìn)行加密和解密。
登錄功能
業(yè)務(wù):
用接受的用戶名密碼核對(duì)后臺(tái)數(shù)據(jù)庫(kù)
將用戶信息寫(xiě)入redis,redis中有該用戶視為登錄狀態(tài)。
用userId+當(dāng)前用戶登錄ip地址+密鑰生成token
重定向用戶到之前的來(lái)源地址,同時(shí)把token作為參數(shù)附上。
生成token
JWT工具
JWT(Json Web Token) 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開(kāi)放標(biāo)準(zhǔn)。
JWT的聲明一般被用來(lái)在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源。比如用在用戶登錄上
JWT 最重要的作用就是對(duì) token信息的防偽作用。
JWT的原理,
一個(gè)JWT由三個(gè)部分組成:公共部分、私有部分、簽名部分。最后由這三者組合進(jìn)行base64編碼得到JWT。
公共部分
主要是該JWT的相關(guān)配置參數(shù),比如簽名的加密算法、格式類型、過(guò)期時(shí)間等等。
私有部分
用戶自定義的內(nèi)容,根據(jù)實(shí)際需要真正要封裝的信息。
簽名部分
根據(jù)用戶信息+鹽值+密鑰生成的簽名。如果想知道JWT是否是真實(shí)的只要把JWT的信息取出來(lái),加上鹽值和服務(wù)器中的密鑰就可以驗(yàn)證真?zhèn)?。所以不管由誰(shuí)保存JWT,只要沒(méi)有密鑰就無(wú)法偽造。
例如:usrInfo+ip=密鑰
base64編碼,并不是加密,只是把明文信息變成了不可見(jiàn)的字符串。但是其實(shí)只要用一些工具就可以吧base64編碼解成明文,所以不要在JWT中放入涉及私密的信息,因?yàn)閷?shí)際上JWT并不是加密信息。
驗(yàn)證功能
功能:當(dāng)業(yè)務(wù)模塊某個(gè)頁(yè)面要檢查當(dāng)前用戶是否登錄時(shí),提交到認(rèn)證中心,認(rèn)證中心進(jìn)行檢查校驗(yàn),返回登錄狀態(tài)、用戶Id和用戶名稱。
業(yè)務(wù):
利用密鑰和IP檢驗(yàn)token是否正確,并獲得里面的userId
用userId檢查Redis中是否有用戶信息,如果有延長(zhǎng)它的過(guò)期時(shí)間。
登錄成功狀態(tài)返回。
業(yè)務(wù)模塊頁(yè)面登錄情況檢查
問(wèn)題:
1 、由認(rèn)證中心簽發(fā)的token如何保存?
2 、難道每一個(gè)模塊都要做一個(gè)token的保存功能?
3 、如何區(qū)分請(qǐng)求是否一定要登錄? 使用的是攔截器
登錄成功后將token寫(xiě)道cookie中
加入攔截器
首先這個(gè)驗(yàn)證功能是每個(gè)模塊都要有的,也就是所有web模塊都需要的。在每個(gè)controller方法進(jìn)入前都需要進(jìn)行檢查??梢岳迷趕pringmvc中的攔截器功能。
因?yàn)樵蹅兪嵌鄠€(gè)web模塊分布式部署的,所以不能寫(xiě)在某一個(gè)web模塊中,可以一個(gè)公共的web模塊,就是gmall-web-util中。
檢驗(yàn)方法是否需要驗(yàn)證用戶登錄狀態(tài)
為了方便程序員在controller方法上標(biāo)記,可以借助自定義注解的方式。
比如某個(gè)controller方法需要驗(yàn)證用戶登錄,在方法上加入自定義的@LoginRequie。
CAS
CAS(Central Authentication Service),是耶魯大學(xué)開(kāi)發(fā)的單點(diǎn)登錄系統(tǒng)(SSO,single sign-on),應(yīng)用廣泛,具有獨(dú)立于平臺(tái)的,易于理解,支持代理功能。CAS系統(tǒng)在各個(gè)大學(xué)如耶魯大學(xué)、加州大學(xué)、劍橋大學(xué)、香港科技大學(xué)等得到應(yīng)用
CAS 的設(shè)計(jì)目標(biāo)
(1)為多個(gè)Web應(yīng)用提供單點(diǎn)登錄基礎(chǔ)設(shè)施,同時(shí)可以為非Web應(yīng)用但擁有Web前端的功能服務(wù)提供單點(diǎn)登錄的功能;
(2)簡(jiǎn)化應(yīng)用認(rèn)證用戶身份的流程;
(3)將用戶身份認(rèn)證集中于單一的Web應(yīng)用,讓用戶簡(jiǎn)化他們的密碼管理,從而提高安全性;而且,當(dāng)應(yīng)用需要修改身份驗(yàn)證的業(yè)務(wù)邏輯時(shí),不需要到處修改代碼。