JAAS
SUN的J2EE框架中的JAAS (Java Authentication Authorization Service)提供了靈活和可伸縮的機制來保證客戶端或服務器端的安全。JAAS強調的是通過驗證誰在運行代碼以及它的權限來保護系統免受攻擊。它最偉大的地方是能讓你能夠將一些標準的安全機制,例如:Solaris NIS(網絡信息服務)、Windows NT、LDAP(輕量目錄存取協議)等安全服務便捷的集成到系統中(SUN已經提供了這些標準安全機制的實現類)。當然我們也可以將我們已有的安全系統集成到JAAS中去,所需要的工作僅僅是一個安全接口的封裝和配置工作。
在以下的篇幅中,我們將重點說明一下JAAS中的安全框架的三個應用
u一個基于標準NT模式認證的應用,
u基于自定義安全模式的應用
uJAAS在Web上的應用
[JAAS整體框架]
在應用程序中使用JAAS驗證的步驟:
下面是一個簡單的例子:
?
讓我們先看代碼中涉及到的核心JAAS類和接口。這些類可以被分為三種類型:
u?普通類型Subject,Principal,憑證
u?驗證LoginContext,LoginModule,CallBackHandler,Callback
u?授權Policy,AuthPermission,PrivateCredentialPermission
上面列舉的類和接口大多數都在javax.security.auth包中。在J2SE1.4中,還有一些接口的實現類在com.sun.security.auth包中。?
應用JAAS框架
?
配置部分
上面已經提到,JAAS的可擴展性來源于它能夠進行動態配置,而配置信息通常是保存在文本。這些文本文件有很多個配置塊構成,我們通常把這些配置塊稱作申請(Application)。每個申請對應了一個或多個特定的LoginModule對象.
當你的代碼構造一個LoginContext對象時,你需要把配置文件中申請的名稱傳遞給它。LoginContext將會根據申請中的信息決定激活哪些LoginModule對象,按照什么順序激活以及使用什么規則激活。
配置文件的結構如下所示:
| Application?{ ModuleClass?Flag?ModuleOptions; ?ModuleClass?Flag?ModuleOptions; ...?}; |
下面是一個名稱為Sample的申請
| Sample?{ com.sun.security.auth.module.NTLoginModule?Rquired?debug=true; ?} |
上面這個簡單的申請指定了LoginContext對象應該使用NTLoginModule進行驗證。類的名稱在ModuleClass中被指定。Flag控制當申請中包含了多個LoginModule時進行登錄時的行為:Required、Sufficient、Requisite和Optional。最常用的是Required,使用它意味著對應的LoginModule對象必須被調用,并且必須需要通過所有的驗證。
DEMO1:集成應用NT安全服務
步驟一?編輯配置文件
其中NTLoginModule是SUN提供的NT驗證的實現類,我們只要將其配置進來即可
步驟二?應用JAAS接口
DEMO2集成非標準的安全服務
JAAS也能將非標準的安全服務集成進來,對于非標準的安全服務的集成,我們需要做的工作是用以有的安全接口來實現JAAS的?LoginModule接口和CallBackHandler接口。
步驟一?實現SampleLoginModule
實現LoginModule?接口?,實現4個方法
u?public?boolean?login()?throws?LoginException??中完成密碼校驗工作
u?public?boolean?commit()?throws?LoginException?返回用戶權限,保存入Subject對象
u?public?boolean?abort()?throws?LoginException?中斷用戶的登陸
u?public?boolean?logout()?throws?LoginException?注銷
步驟二?實現CallBackHandler
實現CallbackHandler接口,實現
public?void?handle(Callback[]?callbacks)?主要是獲得用戶認證信息
步驟三?在JAAS中集成
類似DEMO1的NT安全服務的集成
DEMO3?在Web上應用JAAS框架
現在我們希望將通過命令行調用的程序一直到Web應用程序中。由于Web應用程序與一般的應用程序的交互方式有區別不同,我們將不能使用JAAS提供的標準Callback和CallbackHandler類。因為我們不能在Web程序中打開一個命令窗口讓用戶輸入信息。在這種情況下我們可以在創建LoginContext對象前先初始化一個Subject對象,在Subject對象的憑證中保存用戶名和密碼。然后我們可以將該Subject對象傳遞給LoginContext的構造函數。?
| String?user?=?request.getParameter("user"); |
總結
- 上一篇: 法国标致雪铁龙汽车公司采用通快碟片激光器
- 下一篇: MySQL数据导入导出(一)