介紹下這幾天研究的JAAS

作者:千年精靈(MSN:j2ee AT hotmail.com,QQ:800736),轉載請著名出處。

(一)   JAAS技術簡介

JavaTM Authentication and Authorization Service (JAAS),自JDK1.4以來已經集成於JDK之中。

JAAS可以完成如下兩個功能:

l  驗證用戶身份,可靠並且安全的確定當前是誰在執行Java代碼,無論是作爲應用程序執行還是作爲一個applet、一個bean還是一個servlet

l  爲用戶授權,確認他們擁有執行該操作的正確權限。

JAAS驗證技術是可插拔的,這意味着系統允許多種驗證手段共存。新的或者升級了的驗證模塊可以直接使用,而不需要去修改應用本身。系統通過實例化LoginContext對象來啓用驗證過程,LoginContext對象依次引用一個配置文件來決定使用哪(幾)種驗證技術或LoginModule。一個典型的LoginModule可能需要用戶名和密碼來進行驗證,其他的也可能通過讀取聲音或指紋來進行驗證。

JAAS的認證機制建立於一整套可插拔的模塊(參看下圖)基礎上。

 

圖片

JAAS的可插拔模塊認證機制概覽圖

 

JAAS的核心類和接口:

l  公用類

n  SubjectPrincipalCredential

l  驗證類和接口

n  LoginContextLoginModuleCallbackHandlerCallback

l  授權類

n  PolicyAuthPermissionPrivateCredentialPermission

 

 作者:千年精靈(MSN:j2ee AT hotmail.com,QQ:800736),轉載請著名出處。

 

javax.security.auth.Subject是核心類,它表示和一個實體(例如一個人)有關一系列的相關信息,包含此實體的Principal,公開Credential以及私有Credential

下面重點談談幾個核心類。

Subject

要授權訪問資源,應用必須首先驗證請求的來源。JAAS框架使用單詞subject來表示請求的來源。Subject類代表了一個驗證實體,它可以是用戶、管理員、Web服務,設備或者其他的過程。該類包含了三中類型的安全信息:

l  身份(Identities):由一個或多個Principal對象表示

l  公共憑證(Public credentials):例如名稱或公共祕鑰

l  私有憑證(Private credentials):例如口令或私有密鑰

Principals

Principal對象代表了Subject對象的身份。它是一個惟一的實體,比如個人或者組的名字、帳號、社會安全號或者類似的惟一標識。爲了惟一標識一個 subject(這是認證的關鍵部分),一個或者多個 principal 必須與這個 subject 相關聯。

它們實現了java.security.Principaljava.io.Serializable接口。在Subject類中,最重要的方法是getName()。該方法返回一個身份名稱。在Subject對象中包含了多個Principal對象,因此它可以擁有多個名稱。由於登錄名稱、身份證號和Email地址都可以作爲用戶的身份標識,可見擁有多個身份名稱的情況在實際應用中是非常普遍的情況。

Credential

在上面提到的憑證並不是一個特定的類或藉口,一個 subject 可能擁有安全相關的屬性,稱爲憑證(credential)。憑證可以是從簡單的密碼到複雜的加密密鑰的任何東西。它可以是任何對象。憑證中可以包含任何特定安全系統需要的驗證信息,例如標籤(ticket),密鑰或口令。Subject對象中維護着一組特定的私有和公有的憑證,這些憑證可以通過getPrivateCredentials()getPublicCredentials()方法獲得。這些方法通常在應用程序層中的安全子系統被調用。

 

下面是通過時序圖表達的JAAS驗證授權過程:

圖片

         JAAS 建立在一種稱爲可插入的認證模塊(Pluggable Authentication ModulePAM)的安全體系結構之上。PAM 的體系結構是 模塊化的,這意味着它設計爲可以通過交換模塊,支持從一個安全協議組件無縫地轉換到另一個協議組件。這個框架中定義良好的接口使得無需改變或者干擾任何現有的登錄服務就可以加入多種認證技術和授權機制。PAM 體系結構可以集成範圍廣泛的認證技術,包括 RSADCEKerberos 以及 S/Key,因而 JAAS 也可以集成這些技術。此外,這個框架與基於智能卡的認證系統和 LDAP 認證兼容。

 

就像許多 Java 2 平臺技術一樣,JAAS API 定義了應用程序代碼與將要執行業務邏輯的物理實現之間乾淨的抽象。這個抽象層不用重新編譯現有的應用程序代碼就可以作爲登錄模塊的運行時替代。特別是,應用程序寫到 LoginContext API,而認證技術提供程序則寫到 LoginModule 接口。在運行時, LoginContext 將讀取配置文件以確定應使用哪一個(一些)登錄模塊對訪問特定應用程序的用戶進行認證。

 

JAAS 所使用的認證方案以兩種非常重要的實體爲基礎:principal subject。實際被認證的人或者服務稱爲 subject principal是一個惟一的實體,比如個人或者組的名字、帳號、社會安全號或者類似的惟一標識。爲了惟一標識一個 subject(這是認證的關鍵部分),一個或者多個 principal 必須與這個 subject 相關聯。最後,一個 subject 可能擁有安全相關的屬性,稱爲 憑證(credential)。憑證可以是從簡單的密碼到複雜的加密密鑰的任何東西。

 

應用程序通過實例化一個 LoginContext 對象開始認證過程。 LoginContext 查詢一個配置文件以確定進行認證所使用的一種(或者多種)認證技術以及相應的一個(或者多個) LoginModule 。一個非常簡單的 LoginModule 可能會提示輸入用戶名和密碼並對它們進行驗證。高級一點的可能會使用現有的操作系統登錄身份進行身份驗證。理論上,甚至可以將一個 JAAS LoginModule 構建成與指紋識別器或者虹膜掃描儀交互。

 

(二)   JAAS的優點

l  Java驗證和授權API)提供了靈活和可伸縮的機制來保證客戶端或服務器端的Java程序。Java早期的安全框架強調的是通過驗證代碼的來源和作者,保護用戶避免受到下載下來的代碼的攻擊。JAAS強調的是通過驗證誰在運行代碼以及他/她的權限來保護系統免受用戶的攻擊。它讓你能夠將一些標準的安全機制,例如Solaris NIS(網絡信息服務)Windows NTLDAP(輕量目錄存取協議)Kerberos等通過一種通用的,可配置的方式集成到系統中。

l  傳統的軟件在實現身份認證功能過程中,往往自行開發專用的認證模塊。由於不同的軟件開發人員在信息安全方面水平參差不齊,實現的認證模塊安全性往往得不到保證。認證和授權應當同業務邏緝分離一個通用的身份認證模塊不僅能減輕軟件開發人員的負擔,更能保證認證的強度,確保在當認證方式發生改變時,應用程序不受影響。

l  可以基於JAAS建立擁有自有技術的單點登錄解決方案。

 

發佈了85 篇原創文章 · 獲贊 1 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章