kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks
          http://www.ebuilds.net/news/kanwu/4/4-03.htm

          前言
             J2EE(Java 2 Platform Enterprise Edition)是美國Sun公司推出的多層企業應用開發模型。J2EE簡化了基于工業標準的、組件化的企業應用開發,提供了一套完整的企業應用的開發框架和服務(Security、Transaction、Naming等)的支持。因此,越來越多的企業應用構建在J2EE平臺上。在企業應用中,首要關心的是應用的安全性,本文首先介紹J2EE中的安全概念和J2EE的安全體系架構。最后展示在程序的開發中怎樣應用J2EE提供的安全特性。

          J2EE中的安全概念
             通俗的講,一個安全的系統首先是保證通過了系統驗證的用戶才能進入系統,不通過系統驗證的用戶是不能進入系統的。通過系統驗證的用戶只能在授權的范圍內操作,而不能接觸到任何未經授權的任何內容(包括功能和數據)。為此目的,在系統中需要先定義以下幾種基本的安全概念:
            主體(Principal):主體(Principal)是被在企業安全服務驗證了的實體。主體(Principal)用主體名作為它的標識,通過與主體相關的驗證數據進行驗證。通常情況下主體名就是用戶的登陸名,驗證數據就是登陸的密碼。 J2EE規范中并沒有限定J2EE 產品提供商使用怎樣的認證方法,因此主體名和驗證數據的內容和格式依不同的認證協議而不同。
            安全策略域(Security Policy Domain):也稱安全域(security domain)或 realm,它是一個邏輯范圍或區域,在這一范圍或區域中安全服務的管理員定義和實施通用的安全策略。它是從安全策略的角度劃分的區域。比如可以將企業應用系統劃分為企業員工、供應商、合作伙伴等不同的安全域,對這些安全區域采用不同的安全策略。
            安全技術域(Security Technology Domain):它是從安全技術的角度劃分的區域,在一個安全技術域中使用同樣的安全機制來執行安全策略。一個安全技術域可以包括多個安全策略域。
            安全屬性(Security Attributes):每個主體(Principal)都有一系列與之相關的安全屬性。安全屬性可用來訪問被保護的資源,檢查用戶的身份和完成其他一些安全相關的用途。J2EE產品提供商或具體的驗證服務的實現來決定怎樣將安全屬性與一個主體聯系起來。J2EE規范并沒有限定什么樣的安全屬性將與主體相聯系。
            信任域(Credential):信任域包含或引用為J2EE系統驗證一個主體的驗證信息(安全屬性)。如果成功的通過了驗證,主體將獲得一個包括安全屬性的信任域。如果被允許的話,一個主體也可能獲取另一個主體的信任域。在這種情況下兩個主體在同一安全域中具有相同的安全屬性。

          J2EE安全體系
            1、基于容器的安全
            在J2EE的環境中,組件的安全是由他們各自的容器來負責的,組件的開發人員幾乎可以不用或者很少在組件中添加有關安全的代碼。這種安全邏輯和業務邏輯相對獨立的架構,使得企業級應用系統有更好的靈活性和擴展性。J2EE規范要求J2EE 產品必須為應用程序開發者提供兩種形式的基于容器的安全性:說明性的安全性和可編程的安全性。
            I、說明性的安全性
            說明性的安全性通過安全結構描述的方式來代表應用程序的安全需求,安全結構一般包括安全角色,訪問控制和驗證要求等。在J2EE平臺中部署描述符充當了說明的安全性的主要工具。部署描述符是組件開發者和應用程序部署者或應用程序組裝者之間的交流工具。應用程序的開發者用它來表示應用中的安全需求,應用程序部署者或應用程序組裝者將安全角色與部署環境中的用戶和組映射起來。
            在程序運行時容器從部署描述符中提取出相應的安全策略,然后容器根據安全策略執行安全驗證。說明的安全性不需要開發人員編寫任何安全相關的代碼,一切都是通過配置部署描述符來完成的。
            II、可編程的安全性
            可編程的安全性在說明性的安全性的基礎上,使安全敏感的應用可以通過調用容器提供的API來對安全作出決斷。這在說明性的安全性不足以滿足企業的安全模型的情況是非常有用的。J2EE在EJB EjbConext interface和servlet HttpServletRequest interface中各提供兩個方法:
            isCallerInRole (EJBContext)
            getCallerPrincipal (EJBContext)
            isUserInRole (HttpServletRequest)
            GetUserPrincipal (HttpServletRequest)
            這些方法允許組件根據調用者或遠程用戶的安全角色來作出商業判斷。
            2、J2EE的驗證模型
            身份驗證是用戶或組件調用者向系統證明其身份的過程。用戶通過某種方式向系統提交驗證信息(通常是用戶名和密碼或者是用戶的數字證書),系統以用戶提供的驗證信息和系統的安全策略來驗證用戶的身份。
          圖一 初始驗證過程
          圖二 驗證URL
          圖三 驗證EJB方法調用
            I、Web 客戶端的驗證
            Web客戶端通常通過http協議來請求web服務器端的資源,這些web資源通常包括html網頁、jsp(java server page)文件、java servlet和其他一些二進制或多媒體文件。在企業環境中,企業的某些資源往往要求只允許某些人訪問,有些資源甚至是機密的或安全敏感的。因此對企業中各種web資源進行訪問控制是十分必要的。為了滿足企業中的不同安全級別和客戶化的需求,J2EE提供了三種基于web客戶端的驗證方式:
            HTTP基本驗證(HTTP Basic Authentication)
            基于表單的驗證(Form-Based Authentication)
            基于客戶端證書的驗證(Client-Certificate Authentication)
            II、應用程序客戶端的驗證
            Java客戶端程序是執行在用戶本地java虛擬機上的java程序,它擁有main方法,通常用戶可通過java.exe或javaw.exe直接啟動執行。J2EE應用程序客戶端與java客戶端程序相似,也擁有main方法,但他們在運行時存在一定的差別。J2EE應用程序客戶端和其他J2EE組件一樣運行在自己的容器中。用戶通過容器來執行J2EE應用程序客戶端。這樣J2EE應用程序客戶端容器就有機會在J2EE應用程序客戶端被執行之前完成用戶身份的驗證。J2EE提供了一種可自定義的方式來獲取用戶的驗證信息。可以選擇使用容器提供的缺省的方式來獲取J2EE應用客戶端程序的用戶的驗證信息,也可以選擇自定義的方式來獲取用戶的驗證信息。
            3、J2EE的授權模型
            I、代碼授權(Code Authorization)
            J2EE產品通過java 2 安全模型來限制特定J2SE的類和方法的執行,以保護和確保操作系統的安全。
            II、調用者授權(Caller Authorization)
            安全角色:安全角色是具有相同安全屬性的邏輯組。它由應用程序的裝配者(Application Assembler)或應用程序的部署者(Application Deployer)分配的。
            III、安全角色引用
            安全角色引用是應用程序提供者(Application Provider)用來引用安全角色的標識。應用程序提供者(Application Provider)可以用安全角色引用來為安全角色分配資源訪問的權限,也可以在安全相關的程序代碼中引用安全角色。
            IV、用戶和組
            用戶和組是在實際系統環境下的用戶和用戶的集合。它們對應著現實當中的人和群體。
            V、訪問控制
            訪問控制可以確保安全角色只能訪問已授予它安全權限的授權對象。授權對象包括EJB的遠程方法、web資源(html網頁,jsp/servlet和多媒體或二進制文件)等。在J2EE中訪問控制在應用程序描述文件中與安全角色關聯起來。
            VI、映射
            通過映射應用程序的系統管理員將實際系統環境中的用戶和角色與安全角色聯系起來,從而是實際的用戶擁有對企業資源訪問的適當授權。
            VII、被傳播的調用者身份標識
            在J2EE 1.3中可以選擇用傳播調用者標識作為web組件和ejb組件調用者的標識來進行驗證。在這種方式下,整個ejb組件的調用鏈中interface EJBContext的方法getCallerPrincipal返回相同的主體名(principal name)。如果調用鏈中的第一個ejb是被jsp/servlet調用的,interface EJBContext的方法getCallerPrincipal返回的主體名(principal name)應與interface HttpServletRequest的方法getUserPrincipal的返回值相同。要注意的是在調用鏈中傳遞的是用戶的標識,而不是憑證(credentials),這一點非常重要,因為在調用鏈的每個節點上用戶可能使用不同的安全屬性。
            VIII、Run As Identities
            J2EE 1.3中提供了允許組件開發者和部署者來指定組件以什么身份運行的方法。符合J2EE1.3規范的產品會提供將組件設置成Run As Identities方式的方法。如果Run As Identities方式被選中,在運行中被設置為Run As Identities的組件的調用者不再是調用鏈中第一個節點的調用者了,而是在部署時被指定的調用者。而調用鏈中隨后節點的調用者也變為與被設置為Run As Identities的組件的調用者相同。
          posted on 2005-05-17 11:59 笨笨 閱讀(1409) 評論(0)  編輯  收藏 所屬分類: J2EEALLWeblogic Portal
          主站蜘蛛池模板: 宜城市| 滨州市| 九龙坡区| 筠连县| 衢州市| 兴业县| 梁平县| 开封市| 尼玛县| 文昌市| 洛阳市| 隆化县| 深圳市| 元氏县| 嘉禾县| 女性| 武宣县| 和政县| 新邵县| 新乐市| 多伦县| 浦北县| 石泉县| 灵丘县| 大庆市| 海门市| 乾安县| 安新县| 秦皇岛市| 东海县| 宁国市| 安图县| 丰顺县| 阳山县| 柘城县| 临海市| 北票市| 安泽县| 璧山县| 乌兰察布市| 柘城县|