1? 引言
??? 在國內(nèi)目前的技術(shù)條件下,新一代仿真系統(tǒng)" title="仿真系統(tǒng)">仿真系統(tǒng)的研制中,基于HLA協(xié)議或者DIS/HLA結(jié)合,實現(xiàn)多武器平臺聯(lián)動、諸軍兵種協(xié)調(diào)、海陸空聯(lián)合演練的復(fù)雜大系統(tǒng),將是對目前軍用仿真技術(shù)的一個挑戰(zhàn)。復(fù)雜大系統(tǒng)的仿真,其各個仿真器節(jié)點地理分布上的大跨度決定了仿真支撐平臺是一個基于網(wǎng)絡(luò)的分布式平臺。對于一個涉及多種異構(gòu)平臺、包含成百上千仿真實體的分布式仿真系統(tǒng)來說,仿真模型及其動態(tài)數(shù)據(jù)的管理,是分布式仿真支撐平臺的基本功能。
??? 基于CORBA、JAVA中間層的RTI參考標準數(shù)據(jù)服務(wù)功能的概念設(shè)計和實現(xiàn)技術(shù)是核心研究內(nèi)容之一,它是連接前端用戶與后臺分布式實時數(shù)據(jù)庫的紐帶。目前,分布式應(yīng)用主要有以下幾種標準, Com、Corba 和J2EE是三種最主要的標準,中間層的實現(xiàn)基本上是基于以上三種標準。Com/Dcom: 由微軟開發(fā)基于COM的一個分布式對象技術(shù),它是微軟全部商業(yè)應(yīng)用的基礎(chǔ)。DCOM也是一個BUS構(gòu)架的,對于COM對象可以即插即用,DCOM模型最適合于Windows/Windows NT環(huán)境。但缺點是局限于Windows 的產(chǎn)品系列;CORBA(Common Object Request Broker Architecture):一項由OMG(對象管理組織)所開發(fā)的技術(shù),表示公共對象請求代理體系結(jié)構(gòu),核心的思想是對象BUS的概念,它允許對象即插即用。CORBA 中IIOP可以跨語言,跨廠商進行操作,在CORBA中面向?qū)ο髢H僅限制為通過引用傳遞的對象或者在整體框架中預(yù)定義。它主要包括三個部分:接口定義語言(IDL),對象請求代理(ORB),ORB間的互操作協(xié)議IIOP。CORBA是基于對象管理體系結(jié)構(gòu)的,OMA為創(chuàng)建分布式應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序定義了廣泛的體系結(jié)構(gòu)。Corba標準能夠跨平臺,但由于各Unix廠商對Corba執(zhí)行得不夠徹底,互聯(lián)比較困難; Sun公司發(fā)起的J2EE是現(xiàn)在市場上的主流產(chǎn)品。J2EE標準是過去幾年中形成的一個與廠家無關(guān)的公共標準,它將許多分散的Java技術(shù)整合到一起,組合成一個完整的企業(yè)標準。因此考慮到分布式仿真應(yīng)用" title="仿真應(yīng)用">仿真應(yīng)用實際情況,如分布性、異構(gòu)平臺等特點,要保證應(yīng)用的伸縮性、靈活性和高可用性,綜合DCOM、CORBA和J2EE的特性,在這里我們選擇J2EE作為分布式仿真應(yīng)用中間層的實現(xiàn)標準。由于分布式節(jié)點實現(xiàn)透明訪問的特性,則系統(tǒng)的安全體系至關(guān)重要,在這里使用JAAS結(jié)合系統(tǒng)本身的特點實現(xiàn)用戶登錄認證和授權(quán)訪問。下圖是分布式仿真應(yīng)用的總體結(jié)構(gòu)圖。

2 J2EE和JAAS
2.1? J2EE框架
?? ?J2EE是一種利用JAVA2平臺來簡化諸多與多級企業(yè)解決方案的開發(fā)、部署和管理相關(guān)的復(fù)雜問題的體系結(jié)構(gòu)。J2EE不但鞏固了J2SE中許多優(yōu)點,如“編寫一次,到處運行”的特性、方便存取數(shù)據(jù)庫的JDBC API、CORBA技術(shù)以及能夠在Internet應(yīng)用中保護數(shù)據(jù)的安全模式等,還提供了對EJB,SERVLET,JSP和XML的支持。J2EE使用EJB SERVER作為商業(yè)組件的部署環(huán)境,并且還提供了支持高可用性和高性能的集群技術(shù)、失敗的自動轉(zhuǎn)移和恢復(fù)、應(yīng)用負載均衡等。J2EE技術(shù)提供了一種基于組件的方法來設(shè)計、開發(fā)、裝配和部署應(yīng)用程序。J2EE服務(wù)器以容器的形式為每一個組件類型提供底層服務(wù)。容器設(shè)置定制了由J2EE服務(wù)器提供的底層支持,這包括諸如安全性、事務(wù)管理、Java命名目錄接口(JNDI)等。JAAS是JAVA 認證和授權(quán)服務(wù),是J2EE內(nèi)嵌的功能。JAAS API 是為用戶認證和授權(quán)而設(shè)計的一套JAVA包。它實現(xiàn)了標準可插入認證模塊PAM的JAVA版本,還相應(yīng)的擴展了Java2平臺的訪問控制結(jié)構(gòu)來支持授權(quán)。
2.2? JAAS技術(shù)
JAVA認證和授權(quán)服務(wù)(JAAS)是J2EE開發(fā)包1.3版本的擴展,和1.4版本的一部分。Java 2 平臺為訪問各種可用的身份識別的方法提供了最為全面一套接口。 Java 平臺更為和各種身份認證" title="身份認證">身份認證系統(tǒng)的交互提供了一個服務(wù)接口,即 Java 身份認證和授權(quán)服務(wù) (JAAS) API。用這個接口,作為服務(wù)供應(yīng)商能夠執(zhí)行高安全性的身份認證,并允許 JAAS 為希望使用哪種身份認證方法的應(yīng)用程序提供通用接口。可以直接利用J2EE本身提供的JAAS安全服務(wù)來保證服務(wù)器的安全。Java認證和授權(quán)服務(wù)JAAS為J2EE應(yīng)用程序提供了一個方法以為一個特定的用戶或一組用戶進行認證和授權(quán)。JAAS是標準的可插入認證模塊PAM結(jié)構(gòu)的Java版本,它對Java 2平臺的安全認證框架進行了擴展以支持基于用戶的安全認證。JAAS是Java 認證和授權(quán)服務(wù)。簡單的說,認證實際上就是確認用戶的身份,而授權(quán)是給特定的用戶合適的訪問權(quán)限,使其不越權(quán)訪問。JAAS API 是為用戶認證和授權(quán)而設(shè)計的一套JAVA包。它實現(xiàn)了標準可插入認證模塊PAM的JAVA版本,還相應(yīng)的擴展了JAVA2平臺的訪問控制結(jié)構(gòu)來支持授權(quán)。
3? 基于JASS設(shè)計實現(xiàn)用戶認證和授權(quán)服務(wù)
??? 當某個用戶要訪問后臺的分布式企業(yè)應(yīng)用時,應(yīng)用程序首先驗證用戶的身份,通過了用戶身份認證之后,然后查看用戶是否有對于應(yīng)用程序的具體模塊具有訪問權(quán)限。
3.1? 身份驗證
??? Login.config作為配置文件,仿真系統(tǒng)使用Login.config文件來指定每個登錄模塊的認證項。Login.config 文件包含 LoginContext 構(gòu)造器中引用的文本字符串和登錄過程列表。幾個參數(shù)用于指定一個給定的登錄過程的成功或失敗對總體認證過程的影響。有如下參數(shù):
·?required 表示登錄模塊必須成功。即使它不成功,還將調(diào)用其它登錄模塊。
·?optional 表示登錄模塊可以失敗,但如果另一個登錄模塊成功,總體登錄仍可以成功。如果所有登錄模塊都是可選的,那么要使整個認證成功至少必須有一個模塊是成功的。
·?requisite 表示登錄模塊必須成功,而且如果它失敗,將不調(diào)用其它登錄模塊。
·?sufficient 表示如果登錄模塊成功,則總體登錄將成功,同時假設(shè)沒有其它必需或必不可少的登錄模塊失敗。
應(yīng)用程序調(diào)入登錄環(huán)境LoginContext, LoginContext 是一種用于設(shè)置登錄過程的 Java 類,它進行實際的登錄,如果登錄成功,獲取 Subject。LoginContext將參考Login.config的配置來進行實際的登錄認證。它有如下四種主要方法:
·?構(gòu)造器loginContext()。它把 login.config 文件中使用的字符串作為其第一個參數(shù),把執(zhí)行實際任務(wù)的回調(diào)" title="回調(diào)">回調(diào)處理程序作為其第二個參數(shù)。
·?login(),它根據(jù) login.config文件中指定的規(guī)范實際登錄。
·?getSubject(),如果登錄總體成功,它返回經(jīng)認證的 Subject。
·?logout(),它向 LoginContext注銷 Subject。
每個登錄模塊以不同的方式認證用戶,傳統(tǒng)的基于口令的登錄模塊要求輸入用戶名和密碼;智能卡登錄模塊要求用戶插卡并驗證PIN;生物型的登錄模塊要求輸入用戶名并且驗證用戶的指紋。針對應(yīng)用程序的安全需求,系統(tǒng)管理員可以在一個應(yīng)用程序中插入多個登錄模塊,實現(xiàn)多層的認證。登錄模塊主要有以下方法提供登錄管理:
·?initialize( subject,callbackHandler, ,) 初始化登錄模塊。
·?login() 設(shè)置任何必需的回調(diào),調(diào)用 CallbackHandler 來處理它們,并將返回的信息(即用戶名和密碼)與允許值進行比較。如果匹配,則登錄模塊成功,盡管仍可能因為另一個登錄模塊不成功而異常終止它,這取決于 login.config 文件中的設(shè)置。
·?commit() 作為兩階段提交過程的一部分被調(diào)用以確定是否成功。如果根據(jù) login.config 文件中指定的約束,所有登錄模塊都是成功的,那么新的 Principal 隨同用戶名一起創(chuàng)建,并被添加到 Subject 的主體集。
·?abort(),如果總體登錄未成功,則調(diào)用它;如果發(fā)生異常終止,必須清除內(nèi)部的登錄模塊狀態(tài)。
·?logout() 被調(diào)用以除去 Subject 的主體集中的 Principal 并執(zhí)行其它內(nèi)部狀態(tài)清除。
用戶按照Login.config配置中規(guī)定的順序被登錄模塊認證。一般的,不管前一個登錄模塊是否登陸成功,用戶繼續(xù)被堆棧里的登錄模塊認證。只有當所有必需的登錄模塊成功后,LoginContext才會返回一個認證成功標識給應(yīng)用程序。LoginContext用兩個階段來執(zhí)行這個步驟。兩個階段都必須成功完成,LoginContext才能返回標識總體認證成功的狀態(tài)。
這兩個階段包括:
(1)LoginContext調(diào)用每個配置過的登錄模塊,并且指引它驗證主題的身份,如果所有的登錄模塊成功通過這個階段,LoginContex就進入第二個階段。
(2)LoginContext再次調(diào)用每個配置過的登錄模塊,指引它正式的執(zhí)行認證。在此階段,每個登錄模塊都會將主題與相關(guān)的含有用戶名和主題的證件的主體聯(lián)系起來。
JAAS登錄使用回調(diào)處理程序來獲取用戶的認證信息。CallbackHandler 是在 LoginContext 對象的構(gòu)造函數(shù)中指定的。回調(diào)處理程序使用幾個提示來獲取用戶的用戶名和密碼信息。從登錄模塊調(diào)用的處理程序的handle()方法將Callback數(shù)組對象作為其參數(shù)。在登錄期間,處理程序遍歷Callback數(shù)組。handle()方法檢查Callback對象的類型并執(zhí)行適當?shù)挠脩舨僮?。LoginContext通過允許應(yīng)用程序規(guī)定Callback來解決這個問題,它底層的登錄模塊可以與用戶相互作用。應(yīng)用程序提供一個CallbackHander給Login Context,這樣LoginContext可以直接把它傳遞給每個登錄模塊。所以每個登錄模塊可以調(diào)用Callback來收集或顯示相關(guān)信息。
現(xiàn)在假設(shè)登陸模塊LoginM1和LonginM2,且這兩個登陸模塊都要求必須成功,則登陸流程如下:

3.2 授權(quán)訪問
??? 如果該用戶已經(jīng)通過系統(tǒng)認證,則系統(tǒng)產(chǎn)生一個JAAS Subject 。要實現(xiàn)用戶對方法級的訪問則要通過安全攔截器的檢查,在系統(tǒng)中我們使用角色與一個用戶集合關(guān)聯(lián),角色被映射到特定的Subject或者特定的用戶組,當角色被映射到一個Subject時,特殊的角色敏感的操作所涉及到的Subject名與從角色中提取的Subject名進行比較以決定操作是否允許執(zhí)行。當角色被映射到一個組時,與一個特殊的角色敏感操作所涉及到的Subject相關(guān)的組與從角色中提取的組進行比較以決定操作是否允許執(zhí)行。這種基于角色的訪問控制要求維護一個角色列表并建立從角色到用戶或者用戶組的映射。
??? 以下是系統(tǒng)授權(quán)的一些基本步驟:
??? 第一步:從EJB容器獲得允許訪問EJB方法的角色名,角色名是有包含調(diào)用方法的方法允許元素中的ejb-jar.xml描述器角色名元素決定的。
??? 第二步:如果沒有指定角色,或者方法在exclude-list元素中指定,那么訪問該方法就被否決了。否則,安全攔截器就調(diào)用JaasSecurityManager.doesUserHaveRole()方法來查看調(diào)用者是否有指定的一個角色名。DoesUserHaveRole方法重申了角色名并檢查認證過的用戶的角色群是否包含指定的用戶名的簡單主體.如果有任何一個角色名在角色群中,訪問就被允許。否則,就否決。
??? 第三步:如果EJB配置了專業(yè)的安全策略,調(diào)用方法就傳遞給安全策略。如果安全策略想否決調(diào)用者的訪問,將生成一個java.lang.SecurityException。如果沒有java.lang.SecurityException生成,訪問EJB方法將被允許,而且方法調(diào)用將被送到下一個容器攔截器進行相關(guān)的處理。
??? 假設(shè)安全域名為SecurityDomain,則授權(quán)流程如下:
?
4 結(jié)論
??? JAVA的JAAS技術(shù)結(jié)合分布式仿真應(yīng)用的要求,實現(xiàn)了系統(tǒng)的安全體系,只有通過JAAS的認證和授權(quán),用戶才能夠安全的訪問后臺分布式數(shù)據(jù)庫或文件系統(tǒng)以及相對應(yīng)的業(yè)務(wù)邏輯操作。
參考文獻
1.Scott Stark and The Jboss Group.Jboss Administration And Development[M]. Jboss Administration And?? Development Second Edition,2002
2.Li Gong.Inside Java 2 Platform Security :Architecture ,Api design,and Implementation[M].Sun Microsystem,Inc,1999
3.Brad Rubin.Java Authentication and Authorization Service[DB/OL]. http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle/021011
4. 謝楊. J2EE核心技術(shù)[N].計算機世界網(wǎng), 2002-6-26
?
