摘要:設(shè)計(jì)一種結(jié)構(gòu)將多個(gè)獨(dú)立的Web應(yīng)用集成為一個(gè)整體,使用戶僅需一次登錄即可完成在所有應(yīng)用下的認(rèn)證,實(shí)現(xiàn)各應(yīng)用間的自由轉(zhuǎn)換。結(jié)合Resin容器自身的認(rèn)證授權(quán)機(jī)制,通過設(shè)計(jì)實(shí)現(xiàn)Resin下Authenticator類的一個(gè)子類SSOAuthenticator,使Resin容器與統(tǒng)一登錄框架達(dá)到無縫融合,保證用戶使用的透明性。
關(guān)鍵詞:統(tǒng)一登錄; Resin容器; Authenticator
中圖法分類號(hào):TP393.09文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1001-3695(2007)01-0272-03
統(tǒng)一登錄框架是目前備受關(guān)注的新型登錄模式,通過提供對(duì)多個(gè)獨(dú)立Web應(yīng)用的整合策略,使用戶可以實(shí)現(xiàn)框架內(nèi)的“一次登錄,處處暢通”。與傳統(tǒng)的登錄模式相比,它具有三個(gè)方面的優(yōu)勢(shì):
①減少了用戶依次對(duì)各個(gè)應(yīng)用進(jìn)行登錄的操作時(shí)間,從而降低了人工操作的失誤率;
②減少了用戶需要記憶的密碼信息對(duì),從而提高了系統(tǒng)的安全性;
③對(duì)多個(gè)應(yīng)用統(tǒng)一身份管理,方便了系統(tǒng)管理員對(duì)用戶身份的管理操作,提高了系統(tǒng)的反饋性能。
Resin是Caucho公司開發(fā)的一套支持J2EE標(biāo)準(zhǔn)的Web容器。由于它的簡潔易配和對(duì)XML技術(shù)的良好支持性,使其在中小應(yīng)用開發(fā)中得到了廣泛的應(yīng)用。用戶在開發(fā)時(shí),利用Resin自身提供的認(rèn)證授權(quán)機(jī)制,只需進(jìn)行少量配置,就可以實(shí)現(xiàn)一套完整的認(rèn)證授權(quán)系統(tǒng)。因此,利用Resin下已有的認(rèn)證授權(quán)體系,將Resin納入到統(tǒng)一框架中,可以將Resin的易配置性和框架的通用性相結(jié)合,提高統(tǒng)一登錄框架的實(shí)用效能。
出于以上目的,本文給出一個(gè)統(tǒng)一登錄框架的總體設(shè)計(jì),并針對(duì)Resin下已有應(yīng)用,遵照Resin的認(rèn)證授權(quán)體系,提供Resin與框架的無縫融合實(shí)現(xiàn)。
1統(tǒng)一登錄框架的總體設(shè)計(jì)與實(shí)現(xiàn)
1.1設(shè)計(jì)思想
統(tǒng)一登錄框架在設(shè)計(jì)時(shí)需要考慮的主要方面有:
①一致性,用戶在框架內(nèi)的各個(gè)應(yīng)用的身份認(rèn)證應(yīng)具有一致性,在應(yīng)用間轉(zhuǎn)換訪問不需要進(jìn)行重復(fù)登錄;
②通用性,框架應(yīng)能提供對(duì)多種應(yīng)用環(huán)境的支持,能夠?qū)崿F(xiàn)無差別的統(tǒng)一訪問;
③易用性,在將已有應(yīng)用納入框架時(shí),應(yīng)該保證盡量減少對(duì)應(yīng)用的改造工作,減少用戶的使用配置,方便用戶使用。
基于以上三個(gè)方面的考慮,本框架決定采用基于請(qǐng)求代理的策略實(shí)現(xiàn)(圖1)。基本思想是建立一個(gè)統(tǒng)一的Portal服務(wù)器來代理所有的應(yīng)用站點(diǎn)的Web請(qǐng)求,由這個(gè)Portal服務(wù)器來統(tǒng)一處理用戶的認(rèn)證登錄。這里需要說明的是盡管這個(gè)Portal服務(wù)器統(tǒng)一代理所有的Web請(qǐng)求,但實(shí)際上真正進(jìn)行處理的僅僅是用戶認(rèn)證方面的相關(guān)請(qǐng)求,對(duì)于已認(rèn)證用戶的Web請(qǐng)求,僅僅是通過URL轉(zhuǎn)發(fā)將請(qǐng)求傳給應(yīng)用站點(diǎn)。基于這種策略當(dāng)未認(rèn)證用戶訪問某應(yīng)用站點(diǎn)時(shí),Web請(qǐng)求將先被傳入Portal服務(wù)器進(jìn)行用戶認(rèn)證,用戶完成認(rèn)證后再由Portal服務(wù)器將請(qǐng)求轉(zhuǎn)回應(yīng)用站點(diǎn),并將用戶的身份信息包括在請(qǐng)求中一并轉(zhuǎn)回。
圖1基于請(qǐng)求代理的認(rèn)證策略
基于這種策略實(shí)現(xiàn)認(rèn)證需要建立服務(wù)器與應(yīng)用站點(diǎn)間的信任關(guān)系,以便認(rèn)證后的用戶身份能夠被應(yīng)用承認(rèn)。其實(shí)現(xiàn)機(jī)制簡潔,結(jié)構(gòu)框架更靈活,對(duì)原有Web應(yīng)用的改造較少,能夠充分滿足對(duì)于框架一致性、通用性和易用性的設(shè)計(jì)要求。
1.2交互協(xié)議的約定
為更好地保證通用性,實(shí)現(xiàn)Portal服務(wù)器與應(yīng)用間的信息交互,我們?yōu)榭蚣苤贫嘶贖TTP的交互協(xié)議。協(xié)議主要是針對(duì)Portal端與應(yīng)用端的各種交互操作,約定信息格式,以保證任何實(shí)現(xiàn)協(xié)議規(guī)定的應(yīng)用均可以納入到統(tǒng)一登錄框架中。
下面針對(duì)框架下六種操作給出相應(yīng)的具體規(guī)定(注:在協(xié)議中出現(xiàn)的代稱如果拼寫相同,則在沒有特殊說明的情況下具有相同意思):
(1)應(yīng)用站點(diǎn)需要對(duì)用戶身份進(jìn)行認(rèn)證時(shí),將用戶請(qǐng)求重定向到Portal服務(wù)器。重定向請(qǐng)求應(yīng)該遵從以下格式:
url=http://portalURL?reqURL=appSiteURLmaxinterval=session ̄ActiveTimecode=randomNum
其中portalURL為Portal站點(diǎn)的URL地址,appSiteURL為本應(yīng)用站點(diǎn)中用戶請(qǐng)求資源的URL地址(下同),sessionActiveTime為應(yīng)用站點(diǎn)會(huì)話(Session)保持時(shí)間,randomNum為認(rèn)證源碼,可以為隨機(jī)數(shù)或者時(shí)間戳等。應(yīng)用站點(diǎn)通過客戶端瀏覽器的臨時(shí)Cookie或其他方式保存此處的認(rèn)證源碼,以便在Portal服務(wù)器完成認(rèn)證將請(qǐng)求返回時(shí),可以進(jìn)行認(rèn)證碼的校驗(yàn),從而確定用戶身份的合法性。
(2)用戶在Portal端認(rèn)證或注冊(cè)完成后,請(qǐng)求重定向返回應(yīng)用站點(diǎn)。
這個(gè)時(shí)候應(yīng)用站點(diǎn)需要能夠識(shí)別出Portal端返回的正確認(rèn)證的用戶信息,并能夠通過檢驗(yàn)認(rèn)證碼來確保該認(rèn)證信息的合法性。
返回請(qǐng)求的格式為
url=http://appSiteURL?logIdentify=***userID=****code=*****
其中l(wèi)ogIdentify的值為用戶登錄Portal服務(wù)器時(shí)產(chǎn)生的唯一標(biāo)志,userID的值為用戶登錄所用的用戶名,code為Portal端處理后返回的認(rèn)證碼。為了防止有人惡意假冒,只有通過了認(rèn)證碼校驗(yàn)的身份信息才為有效信息。
(3)當(dāng)用戶登錄并與應(yīng)用站點(diǎn)之間建立了會(huì)話連接后,若由于某種原因(如長時(shí)間在該應(yīng)用站點(diǎn)沒有動(dòng)作)導(dǎo)致用戶在應(yīng)用站點(diǎn)的會(huì)話過期(Session Timeout),則當(dāng)用戶再次請(qǐng)求訪問該應(yīng)用站點(diǎn)的受限資源,應(yīng)用站點(diǎn)重新將用戶請(qǐng)求重定向到Portal端認(rèn)證服務(wù)器。
此時(shí)重定向URL格式與操作(1)相同。
(4)Portal對(duì)用戶全局會(huì)話狀態(tài)的定期查詢操作。
本操作主要是判斷已登錄用戶在各個(gè)應(yīng)用是否仍然處于有效會(huì)話期,以便及時(shí)更新Portal上的用戶登錄日志。Portal將通過重定向請(qǐng)求的方式在應(yīng)用站點(diǎn)之間查詢用戶的會(huì)話狀態(tài)。
查詢請(qǐng)求的格式為
url=http://appSiteURL?action=query
其中action=query標(biāo)志此請(qǐng)求是全局狀態(tài)查詢動(dòng)作。
當(dāng)應(yīng)用站點(diǎn)接收到這種請(qǐng)求時(shí),要求對(duì)全局狀態(tài)查詢的動(dòng)作作出反應(yīng)。生成反饋格式為
url=http://portalURL?action=queryreqURL=appSiteURL maxinterval=sessionActiveTime
其中sessionActiveTime為用戶的會(huì)話保持時(shí)間,由用戶在應(yīng)用站點(diǎn)的會(huì)話狀態(tài)決定。當(dāng)用戶是經(jīng)過認(rèn)證的有效用戶且在該應(yīng)用站點(diǎn)仍然處于有效會(huì)話期時(shí),sessionActiveTime的值為該應(yīng)用站點(diǎn)的默認(rèn)會(huì)話保持時(shí)間;當(dāng)用戶在應(yīng)用站點(diǎn)會(huì)話已過期時(shí), sessionActiveTime值為0。在此處,反饋URL中action=query標(biāo)志本次請(qǐng)求是對(duì)全局狀態(tài)查詢的反饋。
(5)用戶注銷操作。
用戶觸發(fā)注銷操作后,瀏覽器被重定向到應(yīng)用站點(diǎn)。重定向請(qǐng)求的格式為
url=http://appSiteURL?action=logout
其中 action=logout表明是請(qǐng)求為注銷操作。
當(dāng)應(yīng)用站點(diǎn)接收到這種注銷指示后,中止對(duì)應(yīng)用戶在該應(yīng)用站點(diǎn)的會(huì)話,同時(shí)生成請(qǐng)求反饋,格式為
url=http://portalURL?action=logout
其中action=logout表示本次重定向是對(duì)注銷操作的反饋。
(6)Portal對(duì)應(yīng)用站點(diǎn)連接狀態(tài)的定期查詢操作。
為了檢查框架下各應(yīng)用站點(diǎn)的可連接性(可連接性指應(yīng)用服務(wù)器處于活動(dòng)狀態(tài),且在網(wǎng)絡(luò)上是可達(dá)的),Portal服務(wù)器會(huì)定期地自動(dòng)向各個(gè)應(yīng)用站點(diǎn)發(fā)HTTP請(qǐng)求。應(yīng)用站點(diǎn)收到Portal的請(qǐng)求后需要給予回應(yīng),以表明自己處于可連接狀態(tài)。
Portal認(rèn)證服務(wù)器向應(yīng)用站點(diǎn)發(fā)HTTP請(qǐng)求,格式為
url=http://appSiteURL?action=portalQuery
其中action=portalQuery表示本次HTTP請(qǐng)求是Portal站點(diǎn)發(fā)來的查詢請(qǐng)求。
應(yīng)用站點(diǎn)對(duì)該HTTP請(qǐng)求作出狀態(tài)答復(fù),格式為
url=http:// portalURL?state=alive
其中state=alive標(biāo)志應(yīng)用處于可連接狀態(tài)。
1.3結(jié)構(gòu)模塊
框架的主要功能模塊分為應(yīng)用入口模塊、認(rèn)證登錄模塊和注銷模塊三部分。其中應(yīng)用入口模塊置于系統(tǒng)框架下的各個(gè)Web應(yīng)用站點(diǎn),采用Filter技術(shù)處理Web請(qǐng)求,提供與Portal端的交互功能;認(rèn)證登錄模塊和注銷模塊統(tǒng)稱為服務(wù)器模塊,置于登錄服務(wù)器Portal上,分別負(fù)責(zé)為應(yīng)用站點(diǎn)提供認(rèn)證登錄服務(wù)和用戶注銷服務(wù)(圖2)。應(yīng)用入口模塊根據(jù)應(yīng)用站點(diǎn)的服務(wù)環(huán)境的不同,提供不同的接入實(shí)現(xiàn),如后文提到了SSOAuthenticator就是一個(gè)Resin環(huán)境下的接入模塊中的主要組成部分。與應(yīng)用入口模塊這種實(shí)現(xiàn)的多樣性相對(duì)的是服務(wù)器模塊也就是認(rèn)證登錄模塊和注銷模塊的唯一性。這種服務(wù)器模塊的統(tǒng)一性和應(yīng)用模塊的多樣性保證了框架的通用性,即實(shí)現(xiàn)了跨應(yīng)用環(huán)境平臺(tái)的統(tǒng)一登錄。
圖2基于Web請(qǐng)求代理的統(tǒng)一登錄框架
2Resin容器的融合設(shè)計(jì)與實(shí)現(xiàn)
2.1Resin容器的認(rèn)證授權(quán)機(jī)制分析
Resin容器自身擁有一套完整的認(rèn)證授權(quán)機(jī)制。該機(jī)制利用了Filter技術(shù),將所有訪問受限資源的請(qǐng)求截獲,對(duì)于其中未認(rèn)證的用戶將請(qǐng)求轉(zhuǎn)向指定的登錄頁面,由指定的Authenticator來處理用戶認(rèn)證;而對(duì)于認(rèn)證通過的用戶,容器將根據(jù)其用戶身份獲取對(duì)應(yīng)的角色信息,進(jìn)行訪問控制。
用戶在進(jìn)行應(yīng)用開發(fā)時(shí),僅僅需要對(duì)web.xml文件進(jìn)行簡單的配置操作,即可實(shí)現(xiàn)完整的認(rèn)證授權(quán)系統(tǒng)。配置文件樣本如下:
<loginconfig>
<authmethod>form</authmethod>
<formloginconfig formloginpage=′/login.jsp′
formerrorpage=′/error.jsp′/>
<authenticator id=′JDBCAuthenticator′>
<rolequery>
SELECT ROLE FROM USER WHERE USERID=?
</rolequery>
</authenticator>
</loginconfig>
<securityconstraint>
<webresourcecollection>
<urlpattern>/admin/*</urlpattern>
</webresourcecollection>
<authconstraint rolename=′admin′/>
</securityconstraint>
…
其中formloginpage指定登錄頁面,formerrorpage指定出錯(cuò)處理頁面,Authenticator指定處理認(rèn)證信息的類,Securityconstraint指定受限資源及其授權(quán)角色。
在Resin容器自身的這套認(rèn)證授權(quán)機(jī)制中也加入了對(duì)于統(tǒng)一登錄的考慮,但是僅僅局限在對(duì)同一個(gè)Resin容器下應(yīng)用的統(tǒng)一登錄,因此,需要重新改造才能將其完全接入已有的框架中。
通過分析Resin源代碼,可以發(fā)現(xiàn)Resin的認(rèn)證授權(quán)機(jī)制中的授權(quán)部分實(shí)際上是從屬于認(rèn)證部分的。而認(rèn)證部分的主要工作由Authenticator來完成,所以將Resin融入框架的關(guān)鍵就在于實(shí)現(xiàn)Resin開發(fā)包中的抽象類Authenticator的一個(gè)合適的子類。
2.2對(duì)Resin環(huán)境下的入口模塊設(shè)計(jì)
由于Resin認(rèn)證授權(quán)機(jī)制的基本思想與統(tǒng)一登錄框架下應(yīng)用入口模塊的設(shè)計(jì)思想基本吻合,均采用Filter技術(shù)來截獲請(qǐng)求,所以在Resin環(huán)境下應(yīng)用入口模塊的設(shè)計(jì)上可以省去Filter的實(shí)現(xiàn),只需考慮與服務(wù)器模塊的交互通信。通過對(duì)Resin機(jī)制的分析,首先考慮設(shè)計(jì)一個(gè) SSOAuthenticator繼承抽象類Authenticator。而不同于一般的Authenticator子類的是,它本身并不對(duì)用戶認(rèn)證信息進(jìn)行處理,而主要負(fù)責(zé)與Portal服務(wù)器的交互工作,由Portal服務(wù)器進(jìn)行統(tǒng)一的認(rèn)證;同時(shí)它還需要遵從Resin的機(jī)制,能夠根據(jù)該用戶的身份信息獲取對(duì)應(yīng)的角色信息完成訪問控制。
其次與服務(wù)器的交互方面,由專門的信息模塊負(fù)責(zé)交互信息的抽取和轉(zhuǎn)發(fā),模塊的設(shè)計(jì)遵從框架約定的通信協(xié)議;內(nèi)部模塊間的交互控制,由SSOAuthenticator負(fù)責(zé),同時(shí)負(fù)責(zé)實(shí)現(xiàn)Resin的認(rèn)證授權(quán)功能。具體實(shí)現(xiàn)按照J(rèn)2EE規(guī)范,復(fù)寫getUserPrincipal ̄Impl()方法,根據(jù)從服務(wù)器傳回的認(rèn)證用戶的身份信息構(gòu)造一個(gè)Principal對(duì)象,并復(fù)寫isUserInRole()方法以便獲取對(duì)應(yīng)的用戶角色。
2.3使用配置
完成應(yīng)用模塊設(shè)計(jì)后,將Resin下的應(yīng)用接入框架時(shí),用戶只需按照Resin規(guī)范對(duì)web.xml文件中的原有應(yīng)用配置進(jìn)行兩處修改(黑體部分),即將formloginpage修改為指定的RedirectServlet,將Authenticator指定為SSOAuthenticator即可。以2.1中的應(yīng)用樣本為例,修改后的配置文件如下:
<loginconfig>
<authmethod>form</authmethod>
<formloginconfig formloginpage=′/servlet/cn.csdb.sso.resinAuth.RedirectServlet′
formerrorpage=′/error.jsp′/>
<authenticator id=′cn.csdb.sso.resinAuth.SSOAuthenticator′>
…
</authenticator>
</loginconfig>
…
3結(jié)束語
統(tǒng)一登錄框架的主要意義在于實(shí)現(xiàn)多應(yīng)用環(huán)境的集成。良好的一致性、通用性和易用性是設(shè)計(jì)統(tǒng)一登錄框架時(shí)必須考慮的基本因素。本文以Resin環(huán)境為例,詮釋了框架在這三個(gè)方面的實(shí)現(xiàn)。實(shí)際上,以上三個(gè)方面僅滿足了統(tǒng)一登錄框架的基本要求,隨著統(tǒng)一登錄技術(shù)的普及,對(duì)于安全性方面的考慮將成為衡量框架設(shè)計(jì)優(yōu)劣的重要標(biāo)準(zhǔn)。如何在滿足一致性、通用性和易用性的基礎(chǔ)上,更好地保證系統(tǒng)的安全,將成為統(tǒng)一登錄框架今后發(fā)展的方向。
參考文獻(xiàn):
[1]The Open Group.X/Open Single SignOn Service (XSSO) Pluggable Authentication Modules[EB/OL].
http://www.opengroup.org/bookstore/catalog/u039.htm,199903.
[2]Brian Gilmore, et al. Core Middleware and Shared Services Studies Single SignOn Report[EB/OL]. http://www.jisc.ac.uk/index.cfm?name=prog_middss_studies,20-040922.
[3]Garman, Jason. Single Signon for Your Web Applications with Apache and Kerberos[EB/OL].
http://www.onlamp.com/pub/a/onlamp/2003/09/11/kerberos.html,20030911.
[4]Chris Dunne. Technical Director, Big Picture Software. Build and Implement a Single SignOn Solution[EB/OL].http://www106.ibm.com/developerworks/ web/library/wasinglesign/,20030930.
[5]Shannon B. Java2 Platform Enterprise Edition Specification v1.4[Z]. Sun Microsystems Inc.
[6]Johannes Fiala. Sharing Session Data between Contexts HOWTO[EB/OL].http://archives.realtime.com/pipermail/tomcatusers/2003May/112539.html,200305.
[7]John Bell, Tony Loton. Java Servlets 2.3編程指南(Professional Java Servlets 2.3)[M]. 北京:電子工業(yè)出版社, 2002.
[8]Authentication with Resin Authorization with Resin[EB/OL]. http://www.caucho.com/resin3.0/security/index.xtp.
作者簡介:
續(xù)巖(1981),男,碩士研究生,主要研究方向?yàn)榇笠?guī)模科學(xué)數(shù)據(jù)共享技術(shù);
閻保平(1950),女,研究員,博導(dǎo),博士,主要研究方向?yàn)榇笠?guī)模科學(xué)數(shù)據(jù)共享技術(shù)、數(shù)據(jù)網(wǎng)格技術(shù)與應(yīng)用等;
季永志(1980),男,碩士研究生,主要研究方向?yàn)榇笠?guī)模科學(xué)數(shù)據(jù)共享技術(shù);
吳開超(1971),男,高級(jí)工程師,主要研究方向?yàn)榇笠?guī)模科學(xué)數(shù)據(jù)共享技術(shù)。
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文