編寫(xiě)你自己的單點(diǎn)登錄(SSO)服務(wù) 3
從WEB-SSO的概念延伸開(kāi),我們可以把SSO的技術(shù)拓展到整個(gè)桌面的應用,不僅僅局限在瀏覽器。SSO的概念和原則都沒(méi)有改變,只需要再做一點(diǎn)點(diǎn)的工作,就可以完成桌面 SSO 的應用。
桌面SSO和WEB-SSO一樣,關(guān)鍵的技術(shù)也在于如何在用戶(hù)登錄過(guò)后保存登錄的憑據。在WEB-SSO中,登錄的憑據是靠瀏覽器的cookie機制來(lái)完成的;在桌面應用中,可以將登錄的憑證保存到任何地方,只要所有SSO的桌面應用都共享這個(gè)憑證。
從網(wǎng)站可以下載一個(gè)簡(jiǎn)單的桌面SSO的樣例(http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso.zip)和全部源碼(http://211.151.94.21/blog/yutoujava/resource/desktopsso_src.zip),雖然簡(jiǎn)單,但是它具有桌面SSO大多數的功能,稍微加以擴充就可以成為自己的解決方案。
6.1桌面樣例的部署
運行此桌面SSO需要三個(gè)前提條件:
a) WEB-SSO的身份認證應用應該正在運行,因為我們在桌面SSO當中需要用到統一的認證服務(wù)
b) 當前桌面需要運行Mozilla或Netscape瀏覽器,因為我們將ticket保存到mozilla的cookie文件中
c) 必須在JDK1.4以上運行。(WEB-SSO需要JDK1.5以上)
解開(kāi)desktopsso.zip文件,里面有兩個(gè)目錄bin和lib。
bin目錄下有一些腳本文件和配置文件,其中config.properties包含了三個(gè)需要配置的參數:
a) SSOServiceURL要指向WebSSO部署的身份認證的URL
b) SSOLoginPage要指向WebSSO部署的身份認證的登錄頁(yè)面URL
c) cookiefilepath要指向當前用戶(hù)的mozilla所存放cookie的文件
在bin目錄下還有一個(gè)login.conf是用來(lái)配置JAAS登錄模塊,本樣例提供了兩個(gè),讀者可以任意選擇其中一個(gè)(也可以都選),再重新運行程序,查看登錄認證的變化
在bin下的運行腳本可能需要作相應的修改
a) 如果是在unix下,各個(gè)jar文件需要用“:”來(lái)隔開(kāi),而不是“;”
b) java 運行程序需要放置在當前運行的路徑下,否則需要加上java的路徑全名。
6.2桌面樣例的運行
樣例程序包含三個(gè)簡(jiǎn)單的Java控制臺程序,這三個(gè)程序單獨運行都需要登錄。如果運行第一個(gè)命叫“GameSystem”的程序,提示需要輸入用戶(hù)名和密碼:

效驗成功以后,便會(huì )顯示當前登錄的用戶(hù)的基本信息等等。

這時(shí)候再運行第二個(gè)桌面Java應用(mailSystem)的時(shí)候,就不需要再登錄了,直接就顯示出來(lái)剛才登錄的用戶(hù)。

第三個(gè)應用是logout,運行它之后,用戶(hù)便退出系統。再訪(fǎng)問(wèn)的時(shí)候,又需要重新登錄了。請讀者再制裁執行完logout之后,重新驗證一下前兩個(gè)應用的SSO:先運行第二個(gè)應用,再運行第一個(gè),會(huì )看到相同的效果。
我們的樣例并沒(méi)有在這里停步,事實(shí)上,本樣例不僅能夠和在幾個(gè)Java應用之間SSO,還能和瀏覽器進(jìn)行SSO,也就是將瀏覽器也當成是桌面的一部分。這對一些行業(yè)有著(zhù)不小的吸引力。
這時(shí)候再打開(kāi)Mozilla瀏覽器,訪(fǎng)問(wèn)以前提到的那兩個(gè)WEB應用,會(huì )發(fā)現只要桌面應用如果登錄過(guò),Web應用就不用再登錄了,而且能顯示剛才登錄的用戶(hù)的信息。讀者可以在幾個(gè)桌面和Web應用之間進(jìn)行登錄和logout的試驗,看看它們之間的SSO。

6.3桌面樣例的源碼分析
桌面SSO的樣例使用了JAAS(要了解JAAS的詳細的信息請參考http://java.sun.com/products/jaas)。JAAS是對PAM(Pluggable Authentication Module)的Java實(shí)現,來(lái)完成 Java應用可插拔的安全認證模塊。使用JAAS作為Java應用的安全認證模塊有很多好處,最主要的是不需要修改源代碼就可以更換認證方式。例如原有的Java應用如果使用JAAS的認證,如果需要應用SSO,只需要修改JAAS的配置文件就行了?,F在在流行的J2EE和其他 Java的產(chǎn)品中,用戶(hù)的身份認證都是通過(guò)JAAS來(lái)完成的。在樣例中,我們就展示了這個(gè)功能。請看配置文件login.conf
|
當我們注解掉第二個(gè)模塊的時(shí)候,只有第一個(gè)模塊起作用。在這個(gè)模塊的作用下,只有test用戶(hù)(密碼是12345)才能登錄。當我們注解掉第一個(gè)模塊的時(shí)候,只有第二個(gè)模塊起作用,桌面SSO才會(huì )起作用。
所有的Java桌面樣例程序都是標準JAAS應用,熟悉JAAS的程序員會(huì )很快了解。JAAS中主要的是登錄模塊(LoginModule)。下面是SSO登錄模塊的源碼:
|
在config.properties的文件中,我們配置了它們的值:
|
SSOServiceURL和SSOLoginPage成員變量指向了在Web-SSO中用過(guò)的身份認證模塊:SSOAuth,這就說(shuō)明在桌面系統中我們試圖和Web應用共用一個(gè)認證服務(wù)。而 cookiefilepath成員變量則泄露了一個(gè)“天機”:我們使用了Mozilla瀏覽器的cookie文件來(lái)保存登錄的憑證。換句話(huà)說(shuō),和Mozilla共用了一個(gè)保存登錄憑證的機制。之所以用Mozilla是應為它的Cookie文件格式簡(jiǎn)單,很容易編程訪(fǎng)問(wèn)和修改任意的Cookie值。(我試圖解析Internet Explorer的cookie文件但沒(méi)有成功。)
下面是登錄模塊DesktopSSOLoginModule的主體:login()方法。邏輯也是非常簡(jiǎn)單:先用Cookie來(lái)登陸,如果成功,則直接就進(jìn)入系統,否則需要用戶(hù)輸入用戶(hù)名和密碼來(lái)登錄系統。
|
下面是Cookielogin()方法的實(shí)體,它的邏輯是: 先從Cookie文件中獲得相應的Cookie值,通過(guò)身份效驗服務(wù)效驗Cookie的有效性。如果cookie有效就算登錄成功;如果不成功或Cookie不存在,用cookie登錄就算失敗。
|
用用戶(hù)名和密碼登錄的方法要復雜一些,通過(guò)Callback的機制和屏幕輸入輸出進(jìn)行信息交互,完成用戶(hù)登錄信息的獲??;獲取信息以后通過(guò)userAuth方法來(lái)調用遠端SSOAuth的服務(wù)來(lái)判定當前登錄的有效性。
|
CookieAuth和userAuth方法都是利用apahce的httpclient工具包和遠程的SSOAuth進(jìn)行http連接,獲取服務(wù)。
|
還有一個(gè)地方需要補充說(shuō)明的是,在本樣例中,用戶(hù)名和密碼的輸入都會(huì )在屏幕上顯示明文。如果希望用掩碼形式來(lái)顯示密碼,以提高安全性,請參考:http://java.sun.com/developer/technicalArticles/Security/pwordmask/
我們的樣例程序(桌面SSO和WEB-SSO)都有一個(gè)共性:要想將一個(gè)應用集成到我們的SSO解決方案中,或多或少的需要修改應用程序。Web應用需要配置一個(gè)我們預制的filter;桌面應用需要加上我們桌面SSO的JAAS模塊(至少要修改JAAS的配置文件)??墒怯泻芏喑绦蚴菦](méi)有源代碼和無(wú)法修改的,例如常用的遠程通訊程序telnet和ftp等等一些操作系統自己帶的常用的應用程序。這些程序是很難修改加入到我們的SSO的解決方案中。
事實(shí)上有一種全方位的SSO解決方案能夠解決這些問(wèn)題,這就是Kerberos協(xié)議(RFC 1510)。Kerberos是網(wǎng)絡(luò )安全應用標準(http://web.mit.edu/kerberos/),由MIT學(xué)校發(fā)明,被主流的操作系統所采用。在采用kerberos的平臺中,登錄和認證是由操作系統本身來(lái)維護,認證的憑證也由操作系統來(lái)保存,這樣整個(gè)桌面都可以處于同一個(gè)SSO的系統保護中。操作系統中的各個(gè)應用(如ftp,telnet)只需要通過(guò)配置就能加入到SSO中。另外使用Kerberos最大的好處在于它的安全性。通過(guò)密鑰算法的保證和密鑰中心的建立,可以做到用戶(hù)的密碼根本不需要在網(wǎng)絡(luò )中傳輸,而傳輸的信息也會(huì )十分的安全。
目前支持Kerberos的操作系統包括Solaris, windows,Linux等等主流的平臺。只不過(guò)要搭建一個(gè)Kerberos的環(huán)境比較復雜,KDC(密鑰分發(fā)中心)的建立也需要相當的步驟。Kerberos擁有非常成熟的API,包括Java的API。使用Java Generic Security Services(GSS) API并且使用JAAS中對Kerberos的支持(詳細信息請參見(jiàn)Sun的Java&Kerberos教程http://java.sun.com/ j2se/1.5.0/docs/guide/security/jgss/tutorials/index.html),要將我們這個(gè)樣例改造成對Kerberos的支持也是不難的。值得一提的是在JDK6.0 (http://www.java.net/download/jdk6)當中直接就包含了對GSS的支持,不需要單獨下載GSS的包。
本文的主要目的是闡述SSO的基本原理,并提供了一種實(shí)現的方式。通過(guò)對源代碼的分析來(lái)掌握開(kāi)發(fā)SSO服務(wù)的技術(shù)要點(diǎn)和充分理解SSO的應用范圍。但是,本文僅僅說(shuō)明了身份認證的服務(wù),而另外一個(gè)和身份認證密不可分的服務(wù)----權限效驗,卻沒(méi)有提到。要開(kāi)發(fā)出真正的SSO的產(chǎn)品,在功能上、性能上和安全上都必須有更加完備的考慮。
附件:
王昱是Sun中國工程研究院的Java工程師,現在的主要負責全球合作伙伴的技術(shù)支持。作為一名Java資深工程師和架構師,王昱在Java 的很多領(lǐng)域都有多年的造詣,特別是在Java虛擬機、J2EE技術(shù)(包括EJB, JSP/Servlet, JMS和Web services等技術(shù))、集群技術(shù)和Java應用性能調優(yōu)上有著(zhù)較為豐富的經(jīng)驗。曾經(jīng)多次在重要的Java會(huì )議發(fā)表演講,并在國際著(zhù)名的Java技術(shù)站點(diǎn)發(fā)表文章。
聯(lián)系客服