面試:第十章:單點登錄

單點登錄業(yè)務介紹

早期單一服務器,用戶認證










缺點:單點性能壓力,無法擴展

WEB應用集群,session共享模式

 

解決了單點性能瓶頸。

問題:

    多業(yè)務分布式數(shù)據獨立管理,不適合統(tǒng)一維護一份session數(shù)據。
    分布式按業(yè)務功能切分,用戶、認證解耦出來單獨統(tǒng)一管理。
    cookie中使用jsessionId 容易被篡改、盜取。
    跨頂級域名無法訪問。

NQ

分布式,SSO(single sign on)模式

 

解決 :  

用戶身份信息獨立管理,更好的分布式管理。

      可以自己擴展安全策略

      跨域不是問題

缺點:

     認證服務器訪問壓力較大。

業(yè)務流程圖

 

認證中心模塊(oauth認證)

數(shù)據庫表:user_info,并添加一條數(shù)據!密碼應該是加密的!

在設計密碼加密方式時 一般是使用MD5+鹽的方式進行加密和解密。
登錄功能
業(yè)務:

    用接受的用戶名密碼核對后臺數(shù)據庫
    將用戶信息寫入redis,redis中有該用戶視為登錄狀態(tài)。
    用userId+當前用戶登錄ip地址+密鑰生成token
    重定向用戶到之前的來源地址,同時把token作為參數(shù)附上。

 
生成token

JWT工具

JWT(Json Web Token) 是為了在網絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準。

JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源。比如用在用戶登錄上

 JWT 最重要的作用就是對 token信息的防偽作用。

JWT的原理,

一個JWT由三個部分組成:公共部分、私有部分、簽名部分。最后由這三者組合進行base64編碼得到JWT。

 

公共部分

主要是該JWT的相關配置參數(shù),比如簽名的加密算法、格式類型、過期時間等等。

私有部分

用戶自定義的內容,根據實際需要真正要封裝的信息。

簽名部分

根據用戶信息+鹽值+密鑰生成的簽名。如果想知道JWT是否是真實的只要把JWT的信息取出來,加上鹽值和服務器中的密鑰就可以驗證真?zhèn)?。所以不管由誰保存JWT,只要沒有密鑰就無法偽造。

例如:usrInfo+ip=密鑰

base64編碼,并不是加密,只是把明文信息變成了不可見的字符串。但是其實只要用一些工具就可以吧base64編碼解成明文,所以不要在JWT中放入涉及私密的信息,因為實際上JWT并不是加密信息。

 
驗證功能

 

功能:當業(yè)務模塊某個頁面要檢查當前用戶是否登錄時,提交到認證中心,認證中心進行檢查校驗,返回登錄狀態(tài)、用戶Id和用戶名稱。
業(yè)務:

    利用密鑰和IP檢驗token是否正確,并獲得里面的userId
    用userId檢查Redis中是否有用戶信息,如果有延長它的過期時間。
    登錄成功狀態(tài)返回。
    業(yè)務模塊頁面登錄情況檢查

 

問題:

1 、由認證中心簽發(fā)的token如何保存?

2 、難道每一個模塊都要做一個token的保存功能?

3 、如何區(qū)分請求是否一定要登錄? 使用的是攔截器

登錄成功后將token寫道cookie中

加入攔截器

首先這個驗證功能是每個模塊都要有的,也就是所有web模塊都需要的。在每個controller方法進入前都需要進行檢查??梢岳迷趕pringmvc中的攔截器功能。

因為咱們是多個web模塊分布式部署的,所以不能寫在某一個web模塊中,可以一個公共的web模塊,就是gmall-web-util中。

檢驗方法是否需要驗證用戶登錄狀態(tài)

為了方便程序員在controller方法上標記,可以借助自定義注解的方式。

比如某個controller方法需要驗證用戶登錄,在方法上加入自定義的@LoginRequie。

 
CAS

CAS(Central Authentication Service),是耶魯大學開發(fā)的單點登錄系統(tǒng)(SSO,single sign-on),應用廣泛,具有獨立于平臺的,易于理解,支持代理功能。CAS系統(tǒng)在各個大學如耶魯大學、加州大學、劍橋大學、香港科技大學等得到應用

CAS 的設計目標

(1)為多個Web應用提供單點登錄基礎設施,同時可以為非Web應用但擁有Web前端的功能服務提供單點登錄的功能;

(2)簡化應用認證用戶身份的流程;

(3)將用戶身份認證集中于單一的Web應用,讓用戶簡化他們的密碼管理,從而提高安全性;而且,當應用需要修改身份驗證的業(yè)務邏輯時,不需要到處修改代碼。