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