來自:
完全跨域的單點(diǎn)登錄實(shí)現(xiàn)方案基本和上篇文章介紹的一樣,只不過生成的過程更復(fù)雜些。上篇文章中的項(xiàng)目是不能完全跨域的,由于多個(gè)應(yīng)用系統(tǒng)以及認(rèn)證系統(tǒng)域不同,也沒有共同的父域,導(dǎo)致登錄后,認(rèn)證系統(tǒng)向?yàn)g覽器寫的在其它應(yīng)用系統(tǒng)中獲取不到,這時(shí)訪問其它應(yīng)用系統(tǒng)時(shí),沒有攜帶著的,無法認(rèn)證也無法單點(diǎn)登錄。那解決的方案是每個(gè)應(yīng)用系統(tǒng)都向?yàn)g覽器中寫入,請(qǐng)看下圖,圖中淺藍(lán)色圓角區(qū)域代表不同的域,當(dāng)用戶通過瀏覽器第一次訪問應(yīng)用系統(tǒng)1時(shí),由于還沒有登錄,會(huì)被引導(dǎo)到認(rèn)證系統(tǒng)進(jìn)行登錄。下面開始單點(diǎn)登錄的過程:認(rèn)證系統(tǒng)根據(jù)用戶在瀏覽器中輸入的登錄信息,進(jìn)行身份認(rèn)證,如果認(rèn)證通過,返回給瀏覽器一個(gè)證明[認(rèn)證系統(tǒng)];這時(shí)再通過瀏覽器將[認(rèn)證系統(tǒng)]發(fā)送到到應(yīng)用系統(tǒng)1的設(shè)置的url,應(yīng)用系統(tǒng)1返回給瀏覽器一個(gè)證明[應(yīng)用系統(tǒng)],這時(shí)再將請(qǐng)求重定向到最初訪問的頁面,以后應(yīng)用系統(tǒng)1就可以自動(dòng)登錄了。現(xiàn)在用戶訪問了應(yīng)用系統(tǒng)2,由于應(yīng)用系統(tǒng)2沒有生成過(但是用戶已經(jīng)在應(yīng)用系統(tǒng)1登錄過一次了),將請(qǐng)求重定向到認(rèn)證系統(tǒng);認(rèn)證系統(tǒng)檢測(cè)到已經(jīng)生成過[認(rèn)證系統(tǒng)]了,認(rèn)證通過;再通過瀏覽器將[認(rèn)證系統(tǒng)]發(fā)送到到應(yīng)用系統(tǒng)2的設(shè)置的url,應(yīng)用系統(tǒng)2返回給瀏覽器一個(gè)證明[應(yīng)用系統(tǒng)],這時(shí)再將請(qǐng)求重定向到最初訪問的頁面。應(yīng)用系統(tǒng)3也同樣原理,我們等于將做了一次同步,保證了每個(gè)應(yīng)用系統(tǒng)都有一份認(rèn)證系統(tǒng)產(chǎn)生的。剩余的驗(yàn)證過程和上篇文章一樣了。
同步的過程用jsonp應(yīng)該也可以實(shí)現(xiàn),我基于上篇文章中的項(xiàng)目實(shí)現(xiàn)了完全跨域的單點(diǎn)登錄,可以在這里下載項(xiàng)目。
域名準(zhǔn)備
修改hosts文件,映射3個(gè)域名:
[html]
三個(gè)域名都是獨(dú)立的,沒有共同父域,web1和web2用于訪問應(yīng)用系統(tǒng),用于訪問認(rèn)證系統(tǒng)。
項(xiàng)目部署
項(xiàng)目中包含的是兩個(gè) ,導(dǎo)入到/后,可能需要設(shè)置下類庫。為認(rèn)證系統(tǒng),為應(yīng)用系統(tǒng),如果映射的域名和我設(shè)置的一樣,不需要設(shè)置,直接部署即可。如果不一樣,需要修改下/WEB-INF/web.xml文件。關(guān)鍵配置信息如下:
[html]
com.ghsau.. :8080// SSOID *.jsp / /
如果域名或端口號(hào)和我的不一致,可以修改對(duì)應(yīng)配置項(xiàng)。最后部署到應(yīng)用服務(wù)器中基于ad域的單點(diǎn)登錄,啟動(dòng)服務(wù)器。
SSO使用
首先輸入第一個(gè)應(yīng)用系統(tǒng)的訪問地址,:8080//index.jsp,如果是第一次訪問的話,會(huì)自動(dòng)跳轉(zhuǎn)到登錄頁,如下圖:
系統(tǒng)中內(nèi)置了3個(gè)用戶,張三、李四、王五,用戶名和密碼皆為拼音全拼,輸入/登錄后,會(huì)自動(dòng)跳轉(zhuǎn)到我們剛才訪問的頁面,頁面中顯示了登錄的用戶名及歡迎信息,如下圖:
這時(shí)基于ad域的單點(diǎn)登錄,我們?cè)佥斎氲诙€(gè)應(yīng)用系統(tǒng)的訪問地址,:8080//index.jsp,我們發(fā)現(xiàn),沒有進(jìn)行第二次登錄,同樣頁面中顯示了登錄的用戶名及歡迎信息,如下圖:
我們接著點(diǎn)擊注銷用戶,頁面跳轉(zhuǎn)到了登錄頁面,這時(shí)我們?cè)倩仡^訪問第一個(gè)應(yīng)用系統(tǒng)的頁面,發(fā)現(xiàn)同樣跳轉(zhuǎn)到了登錄頁面。
互聯(lián)網(wǎng)中的完全跨域登錄的站點(diǎn)也有很多,如淘寶和天貓,但肯定不是我這樣實(shí)現(xiàn)的。我的實(shí)現(xiàn)中,認(rèn)證系統(tǒng)和應(yīng)用系統(tǒng)是通過url參數(shù)來傳遞,可能存在一些不穩(wěn)定因素。應(yīng)用系統(tǒng)的每次請(qǐng)求都會(huì)通過HTTP遠(yuǎn)程到認(rèn)證系統(tǒng)進(jìn)行驗(yàn)證,速度上應(yīng)該會(huì)慢一些,這里可以改進(jìn)一步,在每個(gè)應(yīng)用系統(tǒng)中也維護(hù)一份,驗(yàn)證時(shí),首先到本系統(tǒng)中驗(yàn)證,如果不存在,再遠(yuǎn)程到認(rèn)證系統(tǒng)進(jìn)行驗(yàn)證,但這也增加了應(yīng)用系統(tǒng)的代碼量。本文完,如果有什么問題,歡迎討論。