日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JAAS基礎(chǔ)認證和授權(quán)機制

 Davidwang 2005-10-31
JAAS基礎(chǔ)認證和授權(quán)機制

時間:2003-04-17
作者:Bill KempPeter Holditch
瀏覽次數(shù): 2519
本文關(guān)鍵字:JAAS Authentication Authorization LoginContext LoginModules CallbackHandler Subject
文章工具
推薦給朋友 推薦給朋友
打印文章 打印文章


安全性是所有可以用來對資源進行保護和驗證的機制。有很多種安全模型都可以用來對數(shù)據(jù)提供保護。這些安全模型可以使用加密、訪問控制或其他安全方法。授權(quán)(Authorization),或稱為訪問控制,可以使用不同的安全服務(wù)來對資源進行保護:一種方法是Java認證和授權(quán)服務(wù)(Java Authentication and Authorization Service,JAAS),另外一種方法是Windows 2000的活動目錄(Active Directory)。本文著重于介紹JAAS安全服務(wù)。

認證和授權(quán)是兩種最基本的安全機制。認證就是簡單地對一個實體的身份進行判斷;而授權(quán)則是向?qū)嶓w授予對數(shù)據(jù)資源和信息訪問權(quán)限的決策過程。JDK 1.4已經(jīng)集成了一項提供認證和授權(quán)功能的標(biāo)準(zhǔn)服務(wù),該服務(wù)就稱為Java認證和授權(quán)服務(wù)。

JAAS通過一個配置文件來定義認證機制,而根本不需要使用任何代碼。認證機制之所以需要參數(shù)是為了確定用戶的身份(對用戶進行標(biāo)識)。用來對用戶進行認證的參數(shù),例如每種認證機制中使用的用戶名和口令,都稱為驗證信息。Subject表示我是的那個人,但是我們也可以使用驗證信息(可以理解為駕駛執(zhí)照)向巡警證明自己的身份,并使用另外一個驗證信息(可以理解為護照)向邊防警察證明自己的身份。授權(quán)只能在認證之后進行,因為在向用戶開放保護資源的訪問權(quán)限之前,必須對用戶的身份進行確認。JAAS框架對由配置文件指定的認證模塊進行了包裝。如果認證成功,就會返回一個包含驗證信息的Subject,認證機制所返回的這個驗證信息會用于授權(quán)過程。

JAAS首先使用一個LoginContext類來查找配置文件中的內(nèi)容,這些內(nèi)容可以用來對LoginModules進行初始化(見圖1)。所有LoginContext沒有指定的初始化參數(shù)都會包含在配置文件中。LoginContext還會向LoginModule傳遞一個CallbackHandler,CallbackHandler又會回調(diào)適當(dāng)?shù)膽?yīng)用程序,從而獲得其他認證信息。例如,如果LoginContext在創(chuàng)建CallbackHandler時沒有指定用戶名和口令,而LoginModule又的確需要這些內(nèi)容,那么LoginModule就會使用CallbackHandler來回調(diào)LoginContext,以重新獲得所需要的信息。

為了讓驗證信息可用于登錄,LoginContext還可以向LoginModule傳遞Subject。


圖1 JAAS初始化序列圖

在創(chuàng)建LoginContext時,完成LoginModule的初始化之后,LoginContext就可以調(diào)用login( )方法(見圖2),它會對Subject進行認證。登錄過程需要經(jīng)過一個由LoginModule組成的菊花鏈,根據(jù)配置文件的內(nèi)容,每一步都需要一個不同類型的驗證信息。配置文件還可以指定可選而非必須的LoginModule的配置。LoginModule會完成一個兩階段的登錄過程:第一個階段是登錄過程調(diào)用LoginModule的login( )方法;第二個階段是調(diào)用commit( )或abort( )方法完成登錄過程。commit( )過程是當(dāng)所有其他LoginModule完成自己的login( )方法之后才在登錄過程中被調(diào)用的,然后最后一個LoginModule會調(diào)用commit方法,之后是下一個,依此類推。如果login( )方法不能成功執(zhí)行,就會調(diào)用abort方法來清除已經(jīng)執(zhí)行的操作。如果所有必須的commit( )方法都成功完成了,那么登錄過程也就成功地完成了。


圖2 JAAS登錄序列圖

授權(quán)過程需要使用在登錄過程中確定的驗證信息,因此,認證過程通常都是在Subject類中實現(xiàn)的,這并沒有什么可奇怪的。Subject類會使用PrivilegedAction類來執(zhí)行授權(quán)的過程。另外,還有一個擴展的PrivilegedAction類對要進行訪問控制的資源進行了包裝。不管驗證信息是否有權(quán)對資源進行訪問,這都是在安全策略文件中定義的。Java安全管理程序會首先讀取適當(dāng)?shù)陌踩呗晕募?,并對?quán)限和驗證信息進行分析。然后,安全管理程序會根據(jù)這些權(quán)限和驗證信息使用PrivilegedAction類對資源進行授權(quán)(或禁止訪問)。如果該資源不允許一個特定的驗證信息訪問,就會觸發(fā)一個訪問異常。

在WebLogic中使用JAAS

WebLogic Application Server(WLS)7.0并沒有對JAAS進行任何修改,JAAS依然是一個獨立的擴充框架。WLS 7.0包含了自己的認證和授權(quán)機制,它并不需要策略文件。配置文件會對WLS LoginModule進行定義,使其用來包裝WLS的認證機制。WLS LoginModule通常需要一個用戶名、一個口令以及一個指向適當(dāng)WLS服務(wù)器的URL。WLS 7.0還包含了一種授權(quán)機制,可以對映射資源和角色進行授權(quán)。由于WLS 7.0在WebLogic的安全框架中實現(xiàn)了一種授權(quán)機制,因此策略文件和Java安全管理程序都不需要定義。在調(diào)用PrivilegedAction類時,需要使用weblogic.security.Security類。

WebLogic 7.0給出了一個例子來展示如何執(zhí)行基于JAAS的認證和授權(quán),該例是在一個Java客戶端應(yīng)用程序中調(diào)用EJB來使用JAAS授權(quán)開放對資源的訪問限制。這個例子對下面Sun的例子稍微進行了修改:
http://java./j2se/1.4/docs/guide/security/jaas/JAASRefGuide.html#Sample.

這個例子包括一個JAAS配置文件,該文件指定了以下內(nèi)容:EJB客戶端用來執(zhí)行認證的LoginModule的類名;用來搜集客戶端證書和認證服務(wù)器的URL的CallbackHandler;一個PrivilegedAction類,該類包含了執(zhí)行EJB訪問操作的代碼;以及一個客戶端應(yīng)用程序,該程序會創(chuàng)建一個LoginContext,調(diào)用login( )方法,并通過weblogic.security.Security.runAs方法來調(diào)用PrivilegedAction類。這個例子的流程如圖3所示。你可以查看/weblogic700/samples/server/src/examples/security/jaas文件來參考完整的例子。本文后面的內(nèi)容會參考這個例子,從遠程客戶端的角度來討論WLS中基于JAAS的認證和授權(quán),并將其與服務(wù)器端的組件(例如servlet)進行比較。


圖3 WLS 7.0的認證機制

Java客戶端認證

需要直接訪問WebLogic Server上的EJB或JMS Destination的客戶端應(yīng)用程序使用一個單獨的Java客戶端認證程序進行認證。BEA在WLS 7.0版中提供了一個客戶端的例子,它使用一個JAAS策略文件sample_jaas.config為應(yīng)用程序指定一個LoginModule:weblogic.security.auth.login.UsernamePasswordLoginModule。該文件的內(nèi)容如下:

Sample {
weblogic.security.auth.login.UsernamePasswordLoginModule required debug=false;
};

UsernamePasswordLogin- Module的代碼沒有包含在示例包中,不過類文件位于weblogic.jar中。代碼的詳細內(nèi)容見http://edocs./wls/docs70/security/cli_apps.html#1096287。

它使用weblogic.security.auth.Authenticate類(WebLogic專用的類)來對通過URLCallback指定給LoginModule的實例進行認證。該應(yīng)用程序的CallbackHandler提供了服務(wù)器的URL,服務(wù)器通過自己已配置的Authentication Provider進行認證。

LoginModule會向CallbackHandler傳遞NameCallback和PasswordCallback來獲得客戶端的用戶名和口令,其中該客戶端開始了應(yīng)用程序。一旦用戶通過認證,LoginContext就會將Subject傳遞給LoginModule。然后,應(yīng)用程序使用LoginContext.getSubject方法獲得認證過的Subject。Subject中包含了WebLogic 驗證信息--它可以是一個WLSUser,也可以是一個WLSGroup--它會在把Subject傳遞給Security.runAs方法時用來進行認證。整個JAAS認證過程是由應(yīng)用程序在實例化LoginContext類并調(diào)用LoginContext.login( )方法時進行初始化的。LoginContext會尋找一個已經(jīng)裝載了在JAAS策略文件中發(fā)現(xiàn)的信息的Configuration對象。它使用Configuration來創(chuàng)建一個LoginModule的實例,該實例會用于此后的認證過程。

// Create LoginContext; specify username/password login module
loginContext = new LoginContext("Sample", new SampleCallbackHandler(username, password, url));

這個LoginContext的實例化過程會定位一個在Configuration中找到的LoginModule并對其進行實例化,它使用"Sample"名字在Configuration中查找LoginModule,并將SampleCallbackHandler傳遞給它的初始化方法。從sample_jaas.config文件的內(nèi)容中,你可以看到LoginContext會對一個UsernamePasswordLoginModule的實例進行實例化,從而進行認證。

根據(jù)WebLogic文檔,在WLS 7.0版本中并不推薦使用weblogic.jndi.Environment類。然而,該例子中提供的LoginModule使用weblogic.jndi.Environment對象,通過向Authenticate.authenticate方法傳遞Environment來執(zhí)行認證。其中Environment中包括用戶名、口令以及服務(wù)器的URL。這是一個很明顯的矛盾,因此我們還要在其中加入LoginModule的可插入特性這一優(yōu)點。示例LoginModule的機制,也就是Authenticate類的用法,對于客戶端應(yīng)用程序自己試圖向WebLogic服務(wù)器進行認證時是不可見的。由于LoginModule是可插入認證模塊(Pluggable Authentication Module,PAM)的一個實例,因此它可以方便地進行替換或重寫,而不會影響到客戶端的應(yīng)用程序。這是展示LoginModule可插入特性是如何防止開發(fā)脆弱的應(yīng)用程序代碼的一個很好的例子。 Authenticate.authenticate方法會連接到在URL中指定的WebLogic服務(wù)器上,并可以向服務(wù)器傳遞Subject或Environmet(其中包含了證書),從而由為服務(wù)器的WebLogic安全區(qū)域配置的Authentication提供程序進行認證。服務(wù)器的安全成員域中配置的Authentication提供程序也實現(xiàn)了LoginModule。Authentication提供程序的實現(xiàn)可以使用各種技術(shù)實現(xiàn)認證,例如LDAP或關(guān)系數(shù)據(jù)庫。如果認證成功,Authentication提供程序就向Subject中增加認證過的Principal。在將驗證信息加入Subject之前,它會向驗證信息驗證器發(fā)起一個請求,從而對驗證信息進行數(shù)字簽名。這樣,在調(diào)用Security.runAs返回Subject并試圖執(zhí)行關(guān)鍵授權(quán)檢查時,可以防止惡意的客戶端篡改所返回的Subject中嵌入的驗證信息。驗證信息驗證器會在授權(quán)過程中進行查詢,從而確保所返回的Subject和在認證過程中進行數(shù)字簽名過的Subject完全相同。

基于瀏覽器的認證

即便不是大多數(shù),也有很多基于WebLogic的應(yīng)用程序是通過基于瀏覽器的客戶端來訪問的。這些應(yīng)用程序通常由servlet、JSP、EJB等組成。對這些應(yīng)用程序的認證在元素中定義為BASIC或者FORM,是Web應(yīng)用程序中web.xml部署描述文件中的元素,可以表示應(yīng)用程序的初始訪問頁。例如:


BASIC

當(dāng)我們使用其中一個方法對Web客戶端進行認證時,Web容器根據(jù)客戶端的行為調(diào)用Web安全框架,并訪問Authentication 提供程序。這種機制的結(jié)果是生成了一個JAAS Subject,其中包含一個經(jīng)過認證的驗證信息,保存在一個內(nèi)部會話對象之中。從該客戶端發(fā)來的后續(xù)請求通過HttpRequest中傳來的cookie中的會話ID,就可以在內(nèi)部會話中定位這個Subject,從而完成授權(quán)。此處的要點在于,WebLogic上的資源容器,像Web容器,也要使用基于JAAS的認證,根據(jù)Web客戶端的行為,調(diào)用Authentication提供程序,獲取一個填充有經(jīng)過認證的驗證信息的Subject。Authentication提供程序使用的LoginModule并沒有在JAAS配置文件中配置,這一點與Java客戶端的例子不同。通過管理控制臺將Authentication提供程序增加到活動的安全成員域中,就可以實現(xiàn)對Authentication提供程序的配置。WLS 7.0 默認配置的Authentication提供程序和LoginModul都是即裝即用的,使用了一個內(nèi)嵌的LDAP服務(wù)器。服務(wù)器端用來認證基于Web的客戶端的LoginModule就是Java客戶端應(yīng)用程序的UsernamePasswordLoginModule調(diào)用Authenticate.authenticate方法傳遞Subject和Environment對象進行認證時使用的那個LoginModule。這個Subject沒有傳回Web客戶端,而是由Web容器保存在內(nèi)部會話對象中,稍后通過會話ID訪問。

基于JAAS的授權(quán)

盡管WLS中的授權(quán)沒有使用JAAS的Subject.doAs方法,它仍然是基于JAAS Subject的。要求訪問受保護的WebLogic資源的應(yīng)用程序通過weblogic.security.Security.runAs方法請求訪問。Subject和PrivilegedAction被傳遞給這個WLS安全框架方法,以執(zhí)行有關(guān)一項WebLogic資源的任務(wù)。

WebLogic資源

通過Jave安全策略文件中的安全策略,我們可以對Java系統(tǒng)資源進行保護,而WebLogic的資源與此不同,對這些資源的保護是通過將WebLogic角色與WebLogic資源關(guān)聯(lián)起來的安全策略進行的。一項WebLogic資源定義為一個結(jié)構(gòu)化的對象,表示服務(wù)器端實體,可以保護這些實體拒絕未經(jīng)授權(quán)的用戶進行訪問。WebLogic資源的例子有:EJB方法、servlet以及JMS Destination。有關(guān)更多可以用WebLogic角色保護的WebLogic資源類型實例,請參看http://edocs./wls/docs70/dvspisec/atz.html#1134702處的文檔,

WebLogic角色

WebLogic角色的概念是在WLS 7.0中建立的,它代替了以前發(fā)布的WebLogic中基于ACL的授權(quán)。根據(jù)WLS的文檔,一個角色定義為一個抽象的邏輯用戶集合,與組的概念類似。但是角色與組不一樣,因為角色是根據(jù)用戶名、組成員以及時間動態(tài)更改的。角色與資源一起用,可以創(chuàng)建WebLogic安全策略?;贘AAS的安全策略在Java安全策略文件中定義,其作用是授權(quán)允許訪問codebase、簽名以及驗證信息的權(quán)限。將WebLogic角色與WebLogic資源關(guān)聯(lián)在一起,就建立了一個WebLogic安全策略。WebLogic在應(yīng)用安全策略時并不會考慮Java的策略文件。只要當(dāng)決定對某項資源的訪問權(quán)限時,一個用戶在這項資源的安全策略定義的角色中,那么這個用戶就可以訪問這項資源。

WebLogic角色可以是全局的,即可以將角色與所有的WebLogic資源關(guān)聯(lián);也可以是局部的,即與特定的WebLogic資源關(guān)聯(lián)。全局角色通過管理控制臺定義。安全策略是用局部角色,通過部署描述文件為Web應(yīng)用程序和EJB動態(tài)創(chuàng)建的。對于Web應(yīng)用程序組件,這些角色的聲明及與資源的關(guān)聯(lián)是在web.xml文件;而對于EJB,則是ejb-jar.xml文件的元素。聲明好的角色分別通過提供商特定的部署描述文件、weblogic.xml和weblogicejb-jar.xml,用元素賦予Principals??刂婆_中也可以配置動態(tài)角色,不過控制臺改變之后,組件的部署描述文件不會跟著改變。RoleMapper完成的工作是在部署的時候?qū)①x予Principal的角色關(guān)聯(lián)起來。

WebLogic授權(quán)

當(dāng)應(yīng)用程序通過調(diào)用Security.runAs方法執(zhí)行PrivilegedAction時,Java客戶端應(yīng)用程序的授權(quán)過程就開始了(見圖4)。當(dāng)調(diào)用這個方法時,應(yīng)用程序?qū)⒄J證過的Subject和PrivilegedAction傳遞給WebLogic安全框架。在WLS中,PrivilegedAction內(nèi)部激活了一個EJB方法,SampleAction.java,調(diào)用的身份標(biāo)識就是已經(jīng)通過認證的Subject。服務(wù)器上的EJB容器從PrivilegedAction的上下文中的客戶端EJB stub對象那里接收到請求。然后調(diào)用服務(wù)器上的安全框架,確定是否允許該Subject訪問這個EJB方法。這樣就激活了Authorization提供程序和Role Mapper,由他們來決定那個Subject是否能訪問它所調(diào)用的EJB方法。Role Mapper的作用是決定Pricipals中保持的Roles是否允許訪問那個方法。如果允許,容器繼續(xù)進行方法調(diào)用。應(yīng)該注意的是,在授權(quán)過程開始之前,驗證信息驗證器會驗證傳來的Subject中的驗證信息,看認證之后它有沒有被篡改。


圖4 WLS 7.0的授權(quán)機制

基于瀏覽器的客戶端使用與服務(wù)器相同的授權(quán)機制。區(qū)別在于Subject是由Web容器保存在服務(wù)器上,還是從客戶端應(yīng)用程序中傳過來。瀏覽器發(fā)送cookie中的會話 ID,Web容器在內(nèi)部線程中定位subject,然后調(diào)用安全框架進行授權(quán)。


結(jié)論

JAAS是一種認證授權(quán)機制,它由JAAS規(guī)范定義,在JDK 1.4中實現(xiàn)。JAAS為了實現(xiàn)對認證和授權(quán)的檢查,采用了SecurityManager、AccessController、LoginModule、以及Subject。我們通過Java安全及策略文件配置這些機制,達到保護系統(tǒng)資源和屬性的目的。WebLogic用JAAS中的LoginModule和Subject進行認證和授權(quán);不過Configuration并不是特指Java的安全和策略文件,也不一定非要從這些文件中獲取。

Security提供程序可通過WebLogic控制臺進行配置,它在WebLogic服務(wù)器上實現(xiàn)了Java中SecurityManager和AccessController的角色。通過定義WebLogic角色和WebLogic資源之間關(guān)聯(lián)的安全策略,Security提供程序可以控制對WebLogic資源的訪問。角色既可以通過控制臺,也可以通過配置描述文件來配置。WebLogic的Authentication提供程序用LoginModule和Subject建立一個用戶的身份標(biāo)識。WebLogic的Authorization提供程序通過一個認證Subject,并基于定義的資源安全策略,以及認證Subject的Principal中保存的角色,賦予或者拒絕對WebLogic資源的訪問。

 作者簡介
Bill Kemp是位于Colorado Springs的BEA公司的一位開發(fā)人員關(guān)系工程師(developer relations engineer),在軟件開發(fā)和技術(shù)支持領(lǐng)域已經(jīng)具有14年的從業(yè)經(jīng)驗。他是Sun認證Java程序員(SCJP),同時還是BEA WebLogic的認證程序員。Bill的研究方向主要是EJB、JMS和JDBC。
Peter Holditch于1996年9月作為BEA的顧問加入了位于北歐的專業(yè)服務(wù)組織。目前他在英國是一位售前架構(gòu)師。Peter擁有伯明翰大學(xué)的電子和計算機工程學(xué)位。在不預(yù)售系統(tǒng)架構(gòu)的時候,他喜歡做家具、釀制啤酒,享受英國的漫長夏日。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多