原貼地址:http://www.coolcode.cn/?p=89
目的:
對(duì)目前已有的 Web 應(yīng)用系統(tǒng),和將來待開發(fā)的 Web 應(yīng)用系統(tǒng)進(jìn)行集成,實(shí)現(xiàn)單點(diǎn)登錄。
要求:
- 對(duì)已有的 Web 應(yīng)用系統(tǒng)不作大規(guī)模改造。
- 不限制待開發(fā)的 Web 應(yīng)用系統(tǒng)的開發(fā)工具。
- 不增加待開發(fā)系統(tǒng)的開發(fā)難度。
分析:
- 目前,已有的系統(tǒng)都各自維護(hù)自己的一套用戶庫(kù),每個(gè)系統(tǒng)中的用戶數(shù)、用戶名、密碼幾乎都各不相同。要將已有的用戶庫(kù)進(jìn)行統(tǒng)一是不現(xiàn)實(shí)的。因此,我們可以通過將單點(diǎn)登錄系統(tǒng)中的用戶與其它個(gè)系統(tǒng)中的用戶建立映射,來實(shí)現(xiàn)用一個(gè)帳號(hào)來管理多個(gè)系統(tǒng)的目的。
- 已有的 Web 應(yīng)用系統(tǒng)、以及待開發(fā)的 Web 應(yīng)用系統(tǒng),可能不在同一個(gè)域下,雖然會(huì)話本身是保存在服務(wù)器端,但是會(huì)話 id 是需要 cookie 來傳遞的,而 cookie 不允許跨域訪問,而且考慮到各個(gè)系統(tǒng)的開發(fā)工具也各不相同,即使在同一個(gè)域下,不同的開發(fā)工具所開發(fā)的應(yīng)用程序之間也很難共享會(huì)話,因此要用共享會(huì)話的方式來實(shí)現(xiàn)單點(diǎn)登錄也不現(xiàn)實(shí)。因此我們通過在客戶端瀏覽器、單點(diǎn)登錄系統(tǒng)和 Web 應(yīng)用系統(tǒng)之間傳遞臨時(shí)會(huì)話,并讓 Web 應(yīng)用系統(tǒng)直接到單點(diǎn)登錄系統(tǒng)中獲取認(rèn)證信息來實(shí)現(xiàn)單點(diǎn)登錄。為保證不同開發(fā)工具都能夠到單點(diǎn)登錄系統(tǒng)獲取認(rèn)證信息,我們采用 xml-rpc 在 Web 應(yīng)用系統(tǒng)和單點(diǎn)登錄系統(tǒng)之間進(jìn)行通訊。
實(shí)現(xiàn):
單點(diǎn)登錄系統(tǒng)中設(shè)置 4 個(gè)表:
- 單點(diǎn)登錄系統(tǒng)用戶表,包含 user_id,name,password 3 個(gè)字段。
- Web 應(yīng)用系統(tǒng)表,包含 app_id,name(Web 應(yīng)用系統(tǒng)名稱),checkurl(Web 應(yīng)用系統(tǒng)中用來驗(yàn)證用戶登錄的程序地址) 3 個(gè)字段。
- 單點(diǎn)登錄系統(tǒng)用戶到各個(gè) Web 應(yīng)用系統(tǒng)的用戶映射表,包含id,user_id,app_id,name,password 5 個(gè)字段。
- 臨時(shí)會(huì)話表,包含 hash(臨時(shí)會(huì)話的 hash 編號(hào)),id(對(duì)應(yīng)單點(diǎn)登錄系統(tǒng)用戶到各個(gè) Web 應(yīng)用系統(tǒng)的用戶映射表中的 id 字段) 2個(gè)字段。
用戶登錄單點(diǎn)登錄系統(tǒng)時(shí),通過單點(diǎn)登錄系統(tǒng)用戶表中的字段來驗(yàn)證用戶身份。登錄以后,用戶可以設(shè)置各個(gè)系統(tǒng)到該系統(tǒng)用戶的映射關(guān)系。設(shè)置好以后,當(dāng)通過該系統(tǒng)進(jìn)入其他某個(gè) Web 應(yīng)用系統(tǒng)時(shí),該系統(tǒng)會(huì)為該用戶和該系統(tǒng)生成一個(gè)臨時(shí)會(huì)話編號(hào)(hash),并轉(zhuǎn)到 Web 應(yīng)用系統(tǒng)中的登錄檢測(cè)頁面,登錄檢測(cè)頁面通過獲取到的臨時(shí)會(huì)話編號(hào),來調(diào)用單點(diǎn)登錄系統(tǒng)的獲取用戶名和密碼的 xml-rpc API,如果用戶名密碼如果正確,則轉(zhuǎn)到正常登錄后的頁面,如果不正確,則轉(zhuǎn)到登錄錯(cuò)誤的頁面。這里,xml-rpc API 在返回用戶名和密碼后,將刪除單點(diǎn)登錄系統(tǒng)數(shù)據(jù)庫(kù)中相應(yīng)的臨時(shí)會(huì)話,這樣不但用戶名、密碼都是在服務(wù)器之間進(jìn)行傳遞的,并且臨時(shí)會(huì)話存在的時(shí)間也是盡可能的短,因此只要保證服務(wù)器之間的對(duì)話不能被監(jiān)聽,即可保證安全性。
已有系統(tǒng)需要增加一個(gè)用于單點(diǎn)登錄系統(tǒng)的登錄驗(yàn)證頁面,該頁面工作過程大致如下:
- 獲取 客戶端 hash 值
- 通過 hash 值得到用戶名和密碼(xml-rpc 調(diào)用)
- 通過用戶名和密碼進(jìn)行身份驗(yàn)證
- 返回身份驗(yàn)證后的頁面