《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動(dòng)態(tài) > JAAS在單點(diǎn)登錄系統(tǒng)中的應(yīng)用

JAAS在單點(diǎn)登錄系統(tǒng)中的應(yīng)用

2009-02-25
作者:趙東輝,張曦瓊,李俊

1 引言
隨著電子商務(wù)和電子政務(wù)系統(tǒng)的普及,越來越多的公司或機(jī)構(gòu)面臨著同樣的尷尬,,公司內(nèi)運(yùn)行著多套系統(tǒng),,每個(gè)系統(tǒng)都是一個(gè)孤島,有自己的認(rèn)證和訪問策略,。對(duì)用戶來說,,各系統(tǒng)都需要輸入用戶名,密碼,,不僅麻煩,,而且降低了系統(tǒng)的安全性。為解決這對(duì)矛盾,,產(chǎn)生了單點(diǎn)登錄(Single Sign On,,SSO[1,2])的概念,。所謂單點(diǎn)登錄的核心思想是通過一定的方式使得提供服務(wù)的各網(wǎng)站之間建立某種聯(lián)系,,提供了允許用戶只需一次登錄到站點(diǎn)的內(nèi)建機(jī)制或者上下文環(huán)境,在登陸相互聯(lián)系的多個(gè)網(wǎng)站時(shí)只需要進(jìn)行一次驗(yàn)證即可,,從而保持了應(yīng)用外觀的無縫性,,對(duì)用戶的透明性。
2 傳統(tǒng)認(rèn)證方法比較
單點(diǎn)登錄系統(tǒng)的核心模塊就是其訪問控制模塊,不同的實(shí)現(xiàn)方案,,采取的策略不同或者基于不同的安全標(biāo)準(zhǔn),。有的基于Kerberos[3]認(rèn)證協(xié)議,有的利用windows NT的LDAP(Lightweight Directory Access Protocol),,也有的基于Solaris NIS網(wǎng)絡(luò)信息服務(wù)的認(rèn)證,。雖然有不少產(chǎn)品是利用java開發(fā)的,但無論Servlet還是EJB的規(guī)范都沒有明確定義如何來實(shí)現(xiàn)SSO,,即使在授權(quán)方面,,也沒有明確的解決方案。我們可以在J2EE的藍(lán)皮書中看到對(duì)于同一個(gè)例子:Java Pet Store的訪問控制的幾個(gè)不同的解決方案,,各有其優(yōu)缺點(diǎn),。
在1.0.1版本中,使用基于表單的認(rèn)證方式,,這是我們?cè)趙eb或者電子商務(wù)開發(fā)中常用的方式,。當(dāng)用戶到達(dá)一個(gè)不被授權(quán)訪問的資源時(shí),web容器就推出一個(gè)html頁面,,要求輸入用戶名和密碼,,其缺點(diǎn)就是:可移植性差[6]。
在1.1.2版本中,,采用了基于Servlet的架構(gòu),,基于Servlet的Sign in/Sign out來集中處理所有的request請(qǐng)求,來代替form-based架構(gòu)的訪問控制,,這樣可以使訪問控制模塊的代碼移植到所有支持J2EE平臺(tái)的應(yīng)用上,,而無需修改代碼。缺點(diǎn)是必須由應(yīng)用程序自己來處理,。
在版本1.3中 ,,采用了Filter來實(shí)現(xiàn)。利用Filter來阻止未授權(quán)的訪問,。在這種方案中,,F(xiàn)ilter過濾所有的HTTP請(qǐng)求和響應(yīng)。如成功登錄,,在用戶的session中,,設(shè)置一個(gè)標(biāo)記,,F(xiàn)ilter在每次響應(yīng)前檢查該標(biāo)記是否為真,。因?yàn)檫^濾所有的HTTP請(qǐng)求和響應(yīng),導(dǎo)致響應(yīng)不及時(shí),,增加了響應(yīng)時(shí)延,。
如果我們想開發(fā)一個(gè)可重復(fù)利用的、移植性好的SSO模塊,,以上的三種方案,,都不可行,。本文利用在J2SE 1.4及以后的版本中推出的JAAS[4](Java Authentication Authorization Service)可以很好的解決這個(gè)問題。
3 JAAS概述
3.1 JAAS概述
JAAS在J2SE 1.3版本中還是一個(gè)可選的包,,現(xiàn)在已經(jīng)集成到J2SE 1.4版本中,是1.4及以上版本的標(biāo)準(zhǔn)類庫,。伴隨著J2SE1.5版本的發(fā)布,更包含了許多諸如加密技術(shù),、XML安全性,、公鑰機(jī)制(PKI)、Kerberos和結(jié)盟認(rèn)證(the federating identity)的增強(qiáng),,JAAS在J2EE實(shí)現(xiàn)中扮演一個(gè)越來越重要的角色,。
JAAS框架是從各種不同的安全框架和技術(shù)發(fā)展而來的,JAAS 的可堆疊和可插接功能基于 Unix 的可插接驗(yàn)證模塊 (Pluggable Authentication Module, PAM) 框架,。完全遵循 Java Cryptography Architecture(Java 加密體系結(jié)構(gòu),,JCA)框架體系結(jié)構(gòu),它允許通過 Service Provider Interface(服務(wù)提供接口,,SPI)安插多種安全機(jī)制,,實(shí)現(xiàn)了一個(gè)Java版本的可插入式驗(yàn)證模塊(Pluggable Authentication Module,PAM),,在實(shí)現(xiàn)方面具有獨(dú)立性和互操作性,,在算法上具有獨(dú)立性和可擴(kuò)展性。這就使得上層的應(yīng)用程序與底層所使用的各種驗(yàn)證技術(shù)保持相對(duì)獨(dú)立,,新的或修改后的驗(yàn)證技術(shù)能夠方便地部署到應(yīng)用程序而不需要修改應(yīng)用程序的代碼,。同時(shí),JAAS 還引用了二個(gè)階段的提交協(xié)議中的的事務(wù)行為和 J2SE 1.2 安全包中的安全配置概念,。因此,,JAAS 是多種技術(shù)和概念的精華,它代表了 Java 編程語言的發(fā)展方向,。
JAAS API 包含兩個(gè)方面的安全內(nèi)容,,即認(rèn)證和授權(quán)認(rèn)證是一種通過可靠的方式確定誰是 Java 代碼執(zhí)行者的方法;而授權(quán)是一種確保該人具有執(zhí)行某種給定任務(wù)權(quán)限的方法,。在本文中,,我們結(jié)合SSO重點(diǎn)討論JAAS的認(rèn)證部分。
3.2 JAAS認(rèn)證機(jī)制
認(rèn)證就是校驗(yàn)一個(gè)用戶擁有使用已經(jīng)被企業(yè)用戶注冊(cè)機(jī)構(gòu)證明了的身份鑒定的權(quán)限的處理過程,。JAAS的認(rèn)證機(jī)制建立于一整套插拔" title="可插拔">可插拔的模塊(參看圖1)基礎(chǔ)上,。JAAS允許不同的驗(yàn)證模型(SUN提供了幾個(gè)默認(rèn)的LoginModule ,在sun.com.security.auth.module包里有諸如JndiLoginModule,Krb2LoginModule,UnixLoginModule和NTLoginModule等module,,也可以自定義module)在運(yùn)行時(shí)可被插拔,。客戶應(yīng)用總是通過LoginContext和JAAS交互。
典型的認(rèn)證處理過程要經(jīng)過下面的步驟:
1. 創(chuàng)建登錄環(huán)境,,生成一個(gè)LoginContext對(duì)象,。
LoginContext ctx=new LoginContext(“MyApp”);
LoginContext尋找配置文件以決定使用那個(gè)LoginModule,也有可能傳遞一個(gè)回調(diào)處理程序?qū)ο驝allbackHandler給LoginContext以搜集用戶驗(yàn)證信息如用戶名和口令,,作為選擇,。
2.?通過調(diào)用LoginContext的login方法執(zhí)行認(rèn)證,它會(huì)加載預(yù)定義的LoginModule去檢驗(yàn)是否用戶可以被認(rèn)證,。
3.?如果用戶被認(rèn)證,,那么用規(guī)則和標(biāo)識(shí)和其屬性進(jìn)行關(guān)聯(lián),?或者在登陸失敗的情況下拋出一個(gè)LoginException,。
?使用LoginContext的logout方法進(jìn)行注銷登陸,。

????????????

???????????????????????????????????? 圖1 JAAS的可插拔模塊認(rèn)證機(jī)制概覽圖
在JAAS中,登陸是一個(gè)兩階段(Two-phase)的處理過程,。第一階段是login階段(就像上面2所描述的),。這個(gè)階段唯一的任務(wù)是認(rèn)證。只要處理過程成功通過這個(gè)階段,,認(rèn)證處理過程就進(jìn)入了“提交(commit)”階段(如上步驟3),,這一階段LoginModule的commit方法被調(diào)用去關(guān)聯(lián)所屬子項(xiàng)相關(guān)的規(guī)則和標(biāo)識(shí)。
在所有的認(rèn)證模塊當(dāng)中,,LoginModule是事實(shí)上的認(rèn)證機(jī)制的借口,。雖然LoginModule決沒有得到直接調(diào)用客戶應(yīng)用的機(jī)會(huì),但是他經(jīng)由一個(gè)可插拔的模塊提供了一個(gè)認(rèn)證的具體類型,,其實(shí)現(xiàn)了認(rèn)證的算法并且決定實(shí)際的認(rèn)證過程是怎樣被執(zhí)行的,。
JAAS認(rèn)證結(jié)構(gòu)體系是可擴(kuò)展的,所以只要在配置文件中指定使用哪個(gè)LoginModule模塊就可以幾乎全部插入任何LoginModule模塊,,如下例所示:
MyApp{
Com.exercise.jaas.module.myLoginModule required debug=ture;
};
這里MyApp是LoginContext的名字,,當(dāng)你生成一個(gè)新的LoginContext開始認(rèn)證過程時(shí)它會(huì)被傳入LoginContext的構(gòu)造函數(shù)中。依據(jù)配置文件,,提醒JAAS有關(guān)LoginModule在登錄過程中應(yīng)該被用來執(zhí)行認(rèn)證(此config文件表明myLoginModule將被使用),。
Required參數(shù)及其備選參數(shù)用于指定一個(gè)給定的驗(yàn)證過程的成功或失敗對(duì)總體驗(yàn)證過程的影響:
1)required表示登錄模塊必須成功。即使它不成功,,還將調(diào)用其它登錄模塊,。
2)optional表示登錄模塊可以失敗,但如果另一個(gè)登錄模塊成功,,總體登錄仍可以成功,。如果所有登錄模塊都是可選的,那么要使整個(gè)認(rèn)證成功至少必須有一個(gè)模塊是成功的,。
3)requisite表示登錄模塊必須成功,,而且如果它失敗,,將不調(diào)用其它登錄模塊,。
4)sufficient表示如果登錄模塊成功,,則總體登錄將成功,同時(shí)假設(shè)沒有其它必需或必不可少的登錄模塊失敗,。
ModuleOption允許有多個(gè)參數(shù),。例如你可以設(shè)定調(diào)試參數(shù)為True(debug=true),這樣診斷輸出將被送到System.out中,。
4.單點(diǎn)登錄系統(tǒng)中認(rèn)證功能的設(shè)計(jì)和實(shí)現(xiàn)
目前已經(jīng)出現(xiàn)了眾多的商用SSO產(chǎn)品,,但一般都價(jià)格昂貴,或者局限于特定的平臺(tái),,例如:Microsoft的.net Passport,、IBM WebSphere Portal Server、Netegrity SiteMinder等,,由于J2EE沒有定義SSO的具體實(shí)現(xiàn)方法,,他們的實(shí)現(xiàn)機(jī)制不盡一樣;盡管如此,但這些產(chǎn)品的實(shí)現(xiàn)機(jī)制都遵循一種通用的模式,,這種模式由三個(gè)主要部分組成:入口檢查單元(Gatekeeper),、身份認(rèn)證單元(Authenticator)、用戶憑征存儲(chǔ)單元(User Credential Store),,我們稱在這三個(gè)部分基礎(chǔ)上的SSO為GAC-SSO[6](GateKeeper,,Authenticator and Credential Store SSO),這三個(gè)組成部分之間的交互關(guān)系描述如下:
1.當(dāng)Gatekeeper檢查到用戶請(qǐng)求一個(gè)受保護(hù)的資源時(shí),,它首先檢查該用戶是否已經(jīng)為該Web應(yīng)用創(chuàng)建好一個(gè)Login Session,,若沒有,Gatekeeper再檢查是否已經(jīng)建立一個(gè)和Authenticator相關(guān)的全局SSO session,;
2.若沒有建立全局的SSO Session,,用戶被導(dǎo)向到Authenticator的登錄頁面,并要求用戶提供用戶名和密碼等憑證信息,;
3.Authenticator接受用戶提供的憑證信息,,然后通過用戶的身份認(rèn)證系統(tǒng)驗(yàn)證用戶;
4.若Authenticator驗(yàn)證成功,,建一個(gè)全局Login Session,,導(dǎo)向至Gatekeeper,并在該用戶的Web應(yīng)用中為其創(chuàng)建一個(gè)Login Session,;
5.Authenticator和Gatekeepers之間通過多種方式進(jìn)行交互,,例如:共享cookie方式、Web Service的SOAP或者利用安全聲明標(biāo)記語言(SAML)來進(jìn)行信息的安全交換,。
在GAC-SSO中采用JAAS的認(rèn)證機(jī)制,,使得認(rèn)證變得簡單可行,。由于JAAS支持插拔的認(rèn)證機(jī)制,可以根據(jù)需求進(jìn)行定制不同的LoginModule,,僅對(duì)配置文件進(jìn)行適當(dāng)?shù)男薷?,而代碼幾乎可以不作修改,如我們采用基于Kerberos協(xié)議的認(rèn)證機(jī)制,,SUN已默認(rèn)實(shí)現(xiàn)其LoginModule即Krb2LoginModule,就無需再編碼實(shí)現(xiàn)該Module,,極大的節(jié)省了工作量。
同時(shí),,從圖1可以看出,,在LoginModule之間共享用戶驗(yàn)證信息是利用JAAS實(shí)現(xiàn)單點(diǎn)登錄的基礎(chǔ)和關(guān)鍵,在此我們采用JAAS實(shí)現(xiàn),。首先把各種認(rèn)證機(jī)制按需放入配置文件的登錄模塊列表中,。在LoginModule接口的initialize(Subject subject,CallbackHandler callbackhandler,,Map sharedState,,Map options)方法中,Map類型的sharedState參數(shù)可用于登錄模塊之間的數(shù)據(jù)共享,,因此可用于共享各驗(yàn)證過程的登錄狀態(tài),。
在LoginContext類的login()方法中定義Map類型的成員變量sharedStateMap,在執(zhí)行LoginModule的initialize()方法時(shí)會(huì)將該對(duì)象傳遞給登錄模塊,。Map對(duì)象可保存兩個(gè)對(duì)象之間的映射關(guān)系,,因此GateKeeper中只要執(zhí)行Map類型的sharedStateMap對(duì)象的put(userName,loginFlag)方法,,即可將需要傳遞的信息loginFlag與userName關(guān)聯(lián),,來判斷userName是否登錄(其中每個(gè)用戶的userName在整個(gè)的GAC-SSO中必須唯一)。其他登錄模塊只要使用sharedStateMap對(duì)象的get(userName)方法即可獲取該userName的登錄狀態(tài),,擴(kuò)展開來也可以實(shí)現(xiàn)其他共享信息的傳遞,,但若系統(tǒng)的權(quán)限控制較復(fù)雜,共享信息較多的話,,可以在User Credential Store模塊中,,利用Principal對(duì)象貯存用戶的身份等共享信息,通過Principal對(duì)象進(jìn)行傳遞,。據(jù)此我們可以開發(fā)出符合要求的單點(diǎn)登錄系統(tǒng),。
5 結(jié)束語
GAC-SSO模式比較適合中小企業(yè),尤其是那些需要建立自己的SSO系統(tǒng),,但又沒有很多初始投資的企業(yè),;基于這一模式,企業(yè)不需要依賴特定的SSO產(chǎn)品,,就可以建立擁有自有技術(shù)的單點(diǎn)登錄解決方案,。文中介紹了單點(diǎn)登錄的概念和JAAS框架的構(gòu)成,,最后提出了利用JAAS實(shí)現(xiàn)單點(diǎn)登錄的用戶驗(yàn)證功能。
參考文獻(xiàn)
[1]. The Open Group's "Introduction to Single Sign-On"[EB/OL], http://www.opengroup.org/security/sso/sso_intro.htm?
[2] Mayank Upadhyay and Ram Marti, Single Sign-On Using Kerberos in Java, [EB/OL] http://java.sun.com/j2se/1.4.2/docs/guide/security/jgss/single-signon.html, May 2 2001
[3] John Kohl and B. Clifford Neuman,,The Kerberos Network Authentication Service (Version 5). Internet Request for Comments RFC-1510, September 1993
[4] JAAS Overview[EB/OL], http://java.sun.com/products/jaas/overview.html, 2002
[5]林天峰,,基于JAAS的Java安全編程[J], 計(jì)算機(jī)應(yīng)用與軟件,,2003年7月,,P86-88
[6] Jian Zhong and Mike Lehr, US Department of Energy signs on to J2EE [EB/OL] http://www.javaworld.com/javaworld/jw-05-2002/jw-0524-signon-p2.html, May 24, 2002

?

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。