JAAS簡介及例項(來自JavaEye技術網站)

sunusts發表於2009-01-31
JAAS簡介及例項
來自:JavaEye技術網站:callan.javaeye.com/blog/158392
關鍵字: jaas 例項
JAAS是對JCE安全框架的重要補充,透過提供認證使用者和確定使用者授權來增強JAVA解決方案的動態安全性,使得資源能夠得到很好得到保護和控制(JAAS使用動態的安全策略來定義許可權,而不是將其靜態的嵌入到程式碼中)。

JAAS採用的是外掛的執行方式,一開始就被設計成可插拔的(Pluggable),根據應用的需要,只要配置一下JAAS的配置檔案,這些元件即可包含 在我們的應用程式中。使用JAAS包介面,開發者和第三方可以開發一些元件或者BEAN來實現登陸認證,或者透過與使用者或外部的系統的進行互動來訪問認 證資訊(當然我們可以設計更為穩妥安全的密碼學協議)。JAAS提供了一組用於使用者鑑別的類和介面,這意味著支援JAAS的應用會要求使用者登陸,同時 JAAS提供了另一組用於使用者授權的類和介面。在討論例子之前,先對JAAS API中常用的一些類和介面做個簡單的說明。

LoginModule :確認使用者的合法性(使用CallbackHandler或者其他類方法),並分配訪問許可權principal給subject;

LoginContext:為了實現使用者鑑別,建立相應的環境,從配置檔案中匯入規則;

CallbackHandler:回撥處理器,負責與使用者(程式碼擁有者和執行者)互動,確認其身份的合法性;

Subject:表示登陸處理的目標,即一個被鑑別的使用者。並可關聯一個或多個pirncipal;

Principal:表示具有訪問許可權的一個實體,可以看作是可以執行某種操作的證件。

理解這些類和介面的關係我給個生動的比方:一個軍事學校,入學的時候校方(LoginModule)根據學生(Subject)的入學通知來確定其合法 性,這個過程交由某工作人員(CallbackHandler)執行,(CallbackHandler)確認後,(LoginModule)給不同 (Subject)根據其身份發給相關的證件(Principal),有了該證件就可以訪問對應的資源,(Subject)根據自己的 (Principal)的級別可以使用和訪問學校不同資源。

一個(Subject)的(Principal)如果是公司普通職員級,那麼可以訪問的資源就相對少些,如果是經理級那就多些。當然一個(Subject)可以擁有多個(Principal)。

透過分析我們會發現,JAAS採用的也是身份檢查+許可權分配模式。因此JAAS的應用也分成兩個部分:(1)認證;(2)授權。過程是先認證後根據身份來授權(有歧視的嫌疑的東東,本人可是反歧視人士)。

那麼JAAS是如何實現認證的呢?又是如何實現授權的呢?且聽我慢慢分解,將其妙處展現給大家。

二 JAAS的認證原理

(1) 設定JAAS配置檔案,關於配置非常有技巧,跟設定防火牆的過濾規則有得一拼;

(2) 根據JAAS配置檔案的條目載入一個或者多個LoginModule(通常一個,也可以變態得使用多個);

(3) 為了管理使用者認證的有關過程,將提供一個可選的LoginModule建構函式和一個回撥處理器CallbackHandler。如果沒有在建構函式中提供回撥處理器,系統採用預設設定;

(4) 初始並例項化LoginContext(載入配置規則),如果成功,則呼叫LoginContext的login方法。無論是否需 要,LoginContext都會去首先讀取JAAS配置檔案,從中獲得要載入的登陸模組資訊,其initialize方法將按照配置檔案中的相關內容提 供LoginModule執行所需要的資訊;

(5) LoginContext的login方法將呼叫LoginModule的login方法,確定使用者身份。該方法將設定相關的回撥,並由回撥處理器CallbackHandler來管理登陸處理回撥;

(6) LoginModule的login方法將負責與使用者進行互動(可能是人機互動,也可能是機機互動),如果使用者輸入資訊無效,則該方 法返回FALSE,一次互動過程結束,如果使用者輸入資訊有效,則該方法將設定Principal物件的Subject物件,並返回TRUE;當然 LoginModule也可以將與使用者之間的所有互動過程全部委託給處理器CallbackHandler來處理。如果登陸成功, LoginContext將呼叫LoginModule的commit方法將結果提交給LoginModule例項的內部狀態。


 在應用程式中使用JAAS驗證通常會涉及到以下幾個步驟:

  1. 建立一個LoginContext的例項。

  2. 為了能夠獲得和處理驗證資訊,將一個CallBackHandler物件作為引數傳送給LoginContext。

  3. 透過呼叫LoginContext的login()方法來進行驗證。

  4. 透過使用login()方法返回的Subject物件實現一些特殊的功能(假設登入成功)。

LoginModule描述由身份驗證技術提供程式實現的介面。LoginModule 插入到應用程式中以提供特定型別的身份驗證。

當應用程式寫入 LoginContext API 時,身份驗證技術提供程式將實現 LoginModule介面。Configuration指定將與特定登入應用程式一起使用的 LoginModule(s)。因此可以將不同的 LoginModule 插入到應用程式中,而無需修改應用程式本身。

LoginContext負責讀取 Configuration和例項化適當的 LoginModule。每個 LoginModule都是使用 Subject、CallbackHandler、共享的 LoginModule狀態和特定於 LoginModule 的選項來例項化的。 Subject表示當前正進行身份驗證的 Subject,如果身份驗證成功,則使用相關的 Credential 更新它。LoginModule 使用CallbackHandler與使用者進行通訊。例如,CallbackHandler可以用於提示要求使用者名稱和密碼。注意, CallbackHandler可以為 null。確實需要一個 CallbackHandler來對 Subject進行身份驗證的 LoginModule 可以丟擲 LoginException。LoginModule 可以有選擇地使用共享狀態來共享它們之間的資訊或資料。

特定於 LoginModule 的選項表示由管理員或使用者在 Configuration中為此 LoginModule配置的選項。這些選項由 LoginModule自身定義,並在其中控制其行為。例如,LoginModule可以定義支援除錯/測試功能的選項。這些選項是使用鍵-值語法定義的,例如 debug=true。LoginModule以 Map形式儲存這些選項,因此可以使用鍵來檢索這些值。注意,對 LoginModule選擇定義的選項個數是沒有限制的。

呼叫應用程式將身份驗證過程視為單個操作。但是,LoginModule中的身份驗證過程分兩個不同的階段進行。在第一個階段,LoginModule 的 login方法由 LoginContext 的 login方法呼叫。LoginModule的 login方法執行實際的身份驗證(例如,提示並驗證密碼),並將身份驗證狀態作為私有狀態資訊儲存。一旦完成上述操作,LoginModule 的 login將返回 true(如果成功)或 false(如果應該忽略它),或丟擲 LoginException來指示失敗。在失敗的情況下,LoginModule不必再嘗試進行身份驗證或者引入延遲。由應用程式完成這類任務。如果應用程式試圖重新嘗試身份驗證,將會再次呼叫 LoginModule 的 login方法。

在第二個階段,如果 LoginContext 的整個身份驗證成功(相關的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModule 成功),則呼叫 LoginModule的 commit方法。LoginModule的 commit方法檢查其私有儲存狀態,以檢視自己的身份驗證是否成功。如果整個 LoginContext身份驗證成功,並且 LoginModule 自己的身份驗證也獲得成功,則 commit方法會將相關的 Principal(已進行身份驗證的身份)和 Credential(身份驗證資料,如加密金鑰)與位於 LoginModule中的 Subject聯絡在一起。

如果 LoginContext 的整個身份驗證失敗(相關的 REQUIRED、REQUISITE、SUFFICIENT 和 OPTIONAL LoginModule 沒有成功),則呼叫每個 LoginModule的 abort方法。在這種情況下,LoginModule移除/銷燬原先儲存的任何狀態。

登出 Subject只涉及一個階段。LoginContext呼叫 LoginModule 的 logout方法。然後 LoginModule的 logout方法執行登出過程,例如從 Subject中移除 Principal 或 Credential,或者記錄會話資訊。

LoginModule實現必須有一個無引數的構造方法。這允許載入 LoginModule的類對其進行例項化

[該貼被sunusts於2009-01-31 17:13修改過]

相關文章