現(xiàn)在越來越多的企業(yè)應(yīng) 的框架和服務(wù)的支持.j2ee 等)。本文將介紹j2ee提供 然后結(jié)合具體的實例向讀者 基于j2ee1.3版本的。 | 用構(gòu)建在j2ee平臺上,這得益于 為企業(yè)應(yīng)用提供了多方面的服務(wù) 的安全服務(wù)。首先介紹j2ee中的 展示如何在程序中應(yīng)用j2ee提供 | j2ee為企業(yè)應(yīng)用的開發(fā)提供了良好 (Security、Transaction、Naming 安全概念和j2ee的安全體系架構(gòu), 的安全特性。本文所介紹的內(nèi)容是 |
j2ee中的安全概念 |
主體(Principal): Principal)用主體名作為 名就是用戶的登陸名,驗證 用怎樣的認(rèn)證方法,因此主 | 主體(Principal)是被在企業(yè) 它的標(biāo)識,通過與主體相關(guān)的驗 數(shù)據(jù)就是登陸的密碼。J2EE規(guī)范 體名和驗證數(shù)據(jù)的內(nèi)容和格式依 | 安全服務(wù)驗證了的實體。主體( 證數(shù)據(jù)進行驗證。通常情況下主體 中并沒有限定J2EE 產(chǎn)品提供商使 不同的認(rèn)證協(xié)議而不同。 |
安全策略域(Security 是一個邏輯范圍或區(qū)域,在 它是從安全策略的角度劃分 伙伴等不同的安全域,對這 | Policy Domain):也稱安全域 這一范圍或區(qū)域中安全服務(wù)的管 的區(qū)域。比如可以將企業(yè)應(yīng)用系 些安全區(qū)域采用不同的安全策略 | (security domain)或realm,它 理員定義和實施通用的安全策略。 統(tǒng)劃分為企業(yè)員工、供應(yīng)商、合作 。 |
安全技術(shù)域(Security Technology 個安全技術(shù)域中使用同樣的安全機制來執(zhí) 域。 | Domain):它是從安全技術(shù)的角度劃分的區(qū)域,在一 行安全策略。一個安全技術(shù)域可以包括多個安全策略 |
安全屬性(Security Attributes) 全屬性。安全屬性可用來訪問被保護的資 。J2EE產(chǎn)品提供商或具體的驗證服務(wù)的實 規(guī)范并沒有限定什么樣的安全屬性將與主 | :每個主體(Principal)都有一系列與之相關(guān)的安 源,檢查用戶的身份和完成其他一些安全相關(guān)的用途 現(xiàn)來決定怎樣將安全屬性與一個主體聯(lián)系起來。J2EE 體相聯(lián)系。 |
憑證(Credential): 。如果成功的通過了驗證, 也可能獲取另一個主體的憑 | 憑證包含或引用為J2EE系統(tǒng)驗證 主體將獲得一個包括安全屬性的 證。在這種情況下兩個主體在同 | 一個主體的驗證信息(安全屬性) 憑證。如果被允許的話,一個主體 一安全域中具有相同的安全屬性。 |
j2ee的安全體系結(jié)構(gòu) |
1. 基于容器的安全 |
在j2ee的環(huán)境中,組件的安全是由他 用或者很少在組件中添加有關(guān)安全的代碼 業(yè)級應(yīng)用系統(tǒng)有更好的靈活性和擴展性。 兩種形式的基于容器的安全性-說明性的 | 們各自的容器來負(fù)責(zé)的,組件的開發(fā)人員幾乎可以不 。這種安全邏輯和業(yè)務(wù)邏輯相對獨立的架構(gòu),使得企 J2ee規(guī)范要求j2ee 產(chǎn)品必須為應(yīng)用程序開發(fā)者提供 安全性和可編程的安全性。 |
● 說明性的安全性 |
說明性的安全性通過安 安全角色,訪問控制和驗證 。部署描述符是組件開發(fā)者 開發(fā)者用它來表示應(yīng)用中的 境中的用戶和組映射起來。 | 全結(jié)構(gòu)描述的方式來代表應(yīng)用程 要求等。在j2ee平臺中部署描述 和應(yīng)用程序部署者或應(yīng)用程序組 安全需求,應(yīng)用程序部署者或應(yīng) | 序的安全需求,安全結(jié)構(gòu)一般包括 符充當(dāng)了說明的安全性的主要工具 裝者之間的交流工具。應(yīng)用程序的 用程序組裝者將安全角色與部署環(huán) |
在程序運行時容器從部 全驗證。說明的安全性不需 符來完成的。 | 署描述符中提取出相應(yīng)的安全策 要開發(fā)人員編寫任何安全相關(guān)的 | 略,然后容器根據(jù)安全策略執(zhí)行安 代碼,一切都是通過配置部署描述 |
● 可編程的安全性 |
可編程的安全性在說明 的API來對安全作出決斷。 的。J2ee在EJB EjbConext 個方法: | 性的安全性的基礎(chǔ)上,使安全敏 這在說明性的安全性不足以滿足 interface和servlet HttpServl | 感的應(yīng)用可以通過調(diào)用被容器提供 企業(yè)的安全模型的情況是非常有用 etRequest interface中各提供兩 |
isCallerInRole (EJBContext) |
getCallerPrincipal (EJBContext) |
isUserInRole (HttpServletRequest) |
getUserPrincipal (HttpServletRequest) |
這些方法允許組件根據(jù)調(diào)用者或遠(yuǎn)程 將有這些方法的詳細(xì)介紹和例程,以便讀 模型 | 用戶的安全角色來作出商業(yè)判斷。在文章的后面部分 者更好的理解可編程的安全性的用途。 J2ee的驗證 |
身份驗證是用戶或組件調(diào)用者向系統(tǒng) 證信息(通常是用戶名和密碼或者是用戶 安全策略來驗證用戶的身份。 | 證明其身份的過程。用戶通過某種方式向系統(tǒng)提交驗 的數(shù)字證書),系統(tǒng)用用戶提供的驗證信息和系統(tǒng)的 |
● 用戶的驗證 |
用戶的驗證根據(jù)其客戶 驗證 | 端類型不同分為兩種:Web 客戶 | 端的驗證和Application客戶端的 |
a. Web 客戶端的驗證 |
Web客戶端通常通過htt 、jsp(java server page 境中,企業(yè)的某些資源往往 此對企業(yè)中各種web資源進 化的需求,j2ee提供了三種 | p協(xié)議來請求web服務(wù)器端的資源 )文件、java servlet和其他一 要求只允許某些人訪問,有些資 行訪問控制是十分必要的。為了 基于web客戶端的驗證方式: | ,這些web資源通常包括html網(wǎng)頁 些二進制或多媒體文件。在企業(yè)環(huán) 源甚至是機密的或安全敏感的。因 滿足企業(yè)中的不同安全級別和客戶 |
● HTTP基本驗證(HTTP Basic Authentication) |
HTTP基本驗證 是HTTP協(xié)議所支持的 為驗證信息。Web客戶端從用戶獲取用戶 指定的區(qū)域(realm)中驗證用戶。但需 驗證方法并不對用戶密碼進行加密,而只 務(wù)器對用戶來說也是非驗證過的。不能保 以采用一些安全措施來克服這個弱點。例 VPN技術(shù)。 | 驗證機制。這種驗證機制使用用戶的用戶名和密碼作 名和密碼,然后傳遞他們給web服務(wù)器,web服務(wù)器在 要注意的是,這種驗證方法是不夠安全的。因為這種 是對密碼進行基本的base64的編碼。而且目標(biāo)web服 證用戶訪問到的web服務(wù)器就是用戶希望訪問的???br>如在傳輸層上應(yīng)用SSL或者在網(wǎng)絡(luò)層上使用IPSEC或 |
● 基于表單的驗證(Form-Based Authentication) |
基于表單的驗證使系統(tǒng) 本HTTP的驗證方法的唯一區(qū) 驗證方法同樣具有與基本HT 后密碼以明文形式在網(wǎng)路中 容易就可以獲取用戶的密碼 確定這兩種方式的弱點對你 | 開發(fā)者可以自定義用戶的登陸頁 別就在于它可以根據(jù)用戶的要求 TP驗證類似的不安全的弱點。用 傳遞,如果在網(wǎng)路的某一節(jié)點將 。因此在使用基本HTTP的驗證方 的應(yīng)用是可接受的。 | 面和報錯頁面。這種驗證方法與基 制定登陸和出錯頁面?;诒韱蔚?br>戶在表單中填寫用戶名和密碼,而 此驗證請求截獲,在經(jīng)過反編碼很 式和基于表單的驗證方法時,一定 |
● 基于客戶端證書的 | 驗證(Client-Certificate Aut | hentication) |
基于客戶端證書的驗證方式要比上面 保證驗證的安全性。安全套接層(Secure 器端認(rèn)證,信息真實性等方面的安全保證 你可以把這個公鑰證書看作是你的數(shù)字護 構(gòu)(CA)-一個被信任的組織頒發(fā)的。這 準(zhǔn)。如果你指定了這種驗證方式,Web服 。 | 兩種方式更安全。它通過HTTPS(HTTP over SSL)來 Sockets Layer)為驗證過程提供了數(shù)據(jù)加密,服務(wù) 。在此驗證方式中,客戶端必須提供一個公鑰證書, 照。公鑰證書也稱數(shù)字證書,它是被稱作證書授權(quán)機 個數(shù)字證書必須符合X509公鑰體系結(jié)構(gòu)(PKI)的標(biāo) 務(wù)器將使用客戶端提供的數(shù)字證書來驗證用戶的身份 |
b. 應(yīng)用程序客戶端的 | 驗證(Application Client Use | r Authentication) |
java客戶端程序是執(zhí)行在用戶本地ja 戶可通過java.exe或javaw.exe直接啟動 也擁有main方法,但他們在運行時存在一 運行在自己的容器中。用戶通過容器來執(zhí) 器就有機會在J2ee應(yīng)用程序客戶端被執(zhí)行 的方式來獲取用戶的驗證信息??梢赃x擇 序的用戶的驗證信息,也可以選擇自定義 ,應(yīng)用程序開發(fā)者必須提供一個實現(xiàn)了ja interfce的類,并且在j2ee部署描述文件a 中加入這個類的類名。這樣,當(dāng)系統(tǒng)需要 中的CallbackHandler實現(xiàn)類的類名傳遞 這個實現(xiàn)類。這個類的實例負(fù)責(zé)收集用戶 塊,登陸模塊用這些驗證信息來驗證用戶 用戶輸入來收集用戶驗證信息,也可以是 本地或在線的用戶證書庫來獲取用戶的電 | va虛擬機上的java程序,它擁有main方法,通常由用 執(zhí)行。J2ee應(yīng)用程序客戶端與java客戶端程序相似, 定的差別。J2ee應(yīng)用程序客戶端和其他j2ee組件一樣 行J2ee應(yīng)用程序客戶端。這樣J2ee應(yīng)用程序客戶端容 之前完成用戶身份的驗證。J2ee提供了一種可自定義 使用容器提供的缺省的方式來獲取j2ee應(yīng)用客戶端程 的方式來獲取用戶的驗證信息。當(dāng)選擇自定義方式時 vax.security.auth.callback.CallbackHandler pplication-client.xml中的元素callback-handler 驗證用戶身份時,客戶端程序的容器將部署描述文件 給系統(tǒng)的登陸模塊(驗證模塊),登陸模塊再實例化 驗證信息,并將收集到的用戶驗證信息傳遞給登陸模 。這個實現(xiàn)類可以是具有用戶界面的,或是通過要求 通過命令行來獲取用戶驗證信息,還可能是通過讀取 子證書。選取哪種方式取決于驗證信息的存儲方式。 |
有些j2ee產(chǎn)品廠商把容 務(wù)集成起來,從而在一定的 | 器的驗證服務(wù)和本地系統(tǒng)的驗證 應(yīng)用系統(tǒng)的范圍內(nèi)實現(xiàn)單點登陸 | 服務(wù)或其他應(yīng)用系統(tǒng)產(chǎn)品的驗證服 的能力。 |
● 單點登陸 (Single Sign-On) |
單點登從用戶的視角是 此邏輯安全區(qū)域中不同應(yīng)用 陸。這種能力對多種IT應(yīng)用 提高,企業(yè)中的應(yīng)用系統(tǒng)也 ,這些安全策略典型的包括 由于各系統(tǒng)互相獨立,一個 統(tǒng)登陸。這對于用戶來說必 對于這種情況,單點登陸的 J2ee1.3也在規(guī)范中建議j2e 規(guī)定j2ee產(chǎn)品應(yīng)遵循何種標(biāo) 有的j2ee產(chǎn)品實現(xiàn)了在本產(chǎn) 陸(如IBM WebSphere Appl WebSphere Application Se WebSphere Application Se 點登陸是通過傳遞憑證(Cr WEB客戶端和應(yīng)用程序客戶 security Context),安全 全策略來判斷用戶是否有訪 式,因此不能在不同廠商的 產(chǎn)品間互相共享安全上下文 LDAP server等)集成的方 | 指用戶在特定的邏輯安全區(qū)域中 系統(tǒng)中的被授權(quán)的資源,只有超 系統(tǒng)共存的企業(yè)顯得尤為有價值 越來越多。在傳統(tǒng)的應(yīng)用系統(tǒng)中 組織結(jié)構(gòu)定義,安全角色定義, 用戶在使用每一應(yīng)用系統(tǒng)之前, 須記住每一個系統(tǒng)的用戶名和密 概念隨之產(chǎn)生,并不斷的應(yīng)用到 e產(chǎn)品應(yīng)為應(yīng)用系統(tǒng)提供單點登 準(zhǔn),因此不同的廠商的產(chǎn)品在單 品環(huán)境范圍內(nèi)的單點登陸,有的 ication 4.0 AE 實現(xiàn)了WebSphe rver、WebSphere Application rver與Lotus Domino server之 edential)來實現(xiàn)的.當(dāng)用戶進 端)根據(jù)用戶的憑證(Credenti 上下文包含用于驗證用戶的安全 問系統(tǒng)資源的權(quán)限。遺憾的時j2 j2ee產(chǎn)品之間傳遞安全上下文。 ,因此在不同j2ee產(chǎn)品間實現(xiàn)單 式。 | ,只需進行一次登陸即可在訪問在 越了安全區(qū)域邊緣時才要求再次登 。隨著企業(yè)信息化建設(shè)程度的不斷 ,各系統(tǒng)各自維護自己的安全策略 用戶身份驗證,資源訪問控制等。 都必須按照相應(yīng)的系統(tǒng)身份進行系 碼,給用戶帶來了不小的麻煩。針 企業(yè)的應(yīng)用系統(tǒng)的集成當(dāng)中。 陸的能力。但j2ee1.3規(guī)范并沒有 點登陸上的實現(xiàn)和應(yīng)用各不相同。 實現(xiàn)了特定系統(tǒng)環(huán)境之間的單點登 re Application Server與 Server與Lotus Domino server、 間的單點登陸能力)。在j2ee中單 行系統(tǒng)登陸時,客戶端容器(包括 al)為用戶建立一個安全上下文( 信息,系統(tǒng)用這個安全上下文和安 ee規(guī)范并沒有規(guī)定安全上下文的格 到目前為止還很少有在不同的j2ee 點登陸只能通過第三方產(chǎn)品(如 |
● 惰性驗證(Lazy Authentication) |
身份驗是有代價的。例如,一次驗證 就非常有用了。惰性驗證使當(dāng)用戶訪問受 發(fā)起請求時就執(zhí)行驗證過程。 | 過程也許包括多次通過網(wǎng)絡(luò)信息交換。因此惰性驗證 保護的資源時才執(zhí)行驗證過程,而不是在用戶第一次 |
J2ee的授權(quán)模型 |
● 代碼授權(quán)(Code Authorization) |
j2ee產(chǎn)品通過java 2 統(tǒng)的安全。詳細(xì)描述請參閱 | 安全模型來限制特定J2SE的類和 《J2SE規(guī)范文檔》。 | 方法的執(zhí)行,以保護和確保操作系 |
● 調(diào)用者授權(quán)(Caller Authorization) |
安全角色:安全角色是具有相同安全 Application Assembler)或應(yīng)用程序的 | 屬性的邏輯組。它由應(yīng)用程序的裝配者( 部署者(Application Deployer)分配的。 |
● 安全角色引用:安全角色引用是 安全角色的標(biāo)識。應(yīng)用程序提供者(Appl 色分配資源訪問的權(quán)限。也在安全相關(guān)的 | 應(yīng)用程序提供者(Application Provider)用來引用 ication Provider)可以用安全角色引用來為安全角 程序代碼中引用安全角色。 |
● 用戶和組:用戶和 的人和群體。 | 組是在實際系統(tǒng)環(huán)境下的用戶和 | 用戶的集合。它們對應(yīng)者現(xiàn)實當(dāng)中 |
● 訪問控制:訪問控 對象包括EJB的遠(yuǎn)程方法、w j2ee中訪問控制在應(yīng)用程序 | 制可以確保安全角色只能訪問已 eb資源(html網(wǎng)頁,jsp/servle 描述文件中與安全角色關(guān)聯(lián)起來 | 授予它安全權(quán)限的授權(quán)對象。授權(quán) t和多媒體或二進制文件)等。在 。 |
● 映射:通過映射應(yīng)用程序的系統(tǒng) 系起來,從而是實際的用戶擁有對企業(yè)資 | 管理員將實際系統(tǒng)環(huán)境中的用戶和角色與安全角色聯(lián) 源訪問的適當(dāng)授權(quán)。 |
● 被傳播的調(diào)用者身份標(biāo)識(Propa | gated Caller Identities) |
在j2ee 1.3中可以選擇 證。在這種方式下,整個ej CallerPrincipal返回相同 jsp/servlet調(diào)用的,inter principal name)應(yīng)與inte 。要注意的是在調(diào)用鏈中傳 要,因為在調(diào)用鏈的每個節(jié) | 用傳播調(diào)用者標(biāo)識作為web組件 b組件的調(diào)用鏈中interface EJB 的主體名(principal name)。 face EJBContext的方法getCall rface HttpServletRequest的方 遞的是用戶的標(biāo)識,而不是憑證 點上用戶可能使用不同的安全屬 | 和ejb組件調(diào)用者的標(biāo)識來進行驗 Context的方法get 如果調(diào)用鏈中的第一個ejb是被 erPrincipal返回的主體名( 法getUserPrincipal的返回值相同 (credentials),這一點非常重 性。 |
Run As Identities |
J2ee 1.3中提供了允許 j2ee1.3規(guī)范的產(chǎn)品會提供 Identities方式被選中,在 中第一個節(jié)點的調(diào)用者了, 為與被設(shè)置為Run As Ident | 組件開發(fā)者和部署這來指定組件 將組件設(shè)置成Run As Identitie 運行中被設(shè)置為Run As Identit 而是在部署時被指定的調(diào)用者。 ities的組件的調(diào)用者相同。 | 以什么身份運行的方法。符合 s方式的方法。如果Run As ies的組件的調(diào)用者不再是調(diào)用鏈 而調(diào)用鏈中隨后節(jié)點的調(diào)用者也變 |
j2ee為我們提供了對于 用j2ee為我們提供的這些服 擴展性和可維護性。只有在 安全產(chǎn)品或自己開發(fā)安全服 | 驗證和授權(quán)的安全服務(wù),在開發(fā) 務(wù)。因為只有遵循j2ee標(biāo)準(zhǔn),才 所選j2ee產(chǎn)品不能滿足特定的安 務(wù)。 | 基于j2ee的應(yīng)用時應(yīng)該盡可能的使 能使你的應(yīng)用具有良好的移植性、 全需求時,才應(yīng)該考慮使用第三方 |