<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 30,  comments - 85,  trackbacks - 0
    JAAS 基礎(chǔ)認證和授權(quán)機制

    作者:Bill Kemp, Peter Holditch
    安全性是所有可以用來對資源進行保護和驗證的機制。有很多種安全模型都可以用來對數(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)功能的標準服務(wù),該服務(wù)就稱為Java認證和授權(quán)服務(wù)。

    JAAS通過一個配置文件來定義認證機制,而根本不需要使用任何代碼。認證機制之所以需要參數(shù)是為了確定用戶的身份(對用戶進行標識)。用來對用戶進行認 證的參數(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)適當?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( )過程是當所有其他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安全管理程序會首先讀取適當?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通常需要一個用戶名、一個口令以及一個指向適當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.sun.com/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.bea.com/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

    當我們使用其中一個方法對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.bea.com/wls/docs70/dvspisec/atz.html#1134702處的文檔,

    WebLogic角色

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

    當應(yīng)用程序通過調(diào)用Security.runAs方法執(zhí)行PrivilegedAction時,Java客戶端應(yīng)用程序的授權(quán)過程就開始了(見圖4)。當 調(diào)用這個方法時,應(yīng)用程序?qū)⒄J證過的Subject和PrivilegedAction傳遞給WebLogic安全框架。在WLS中, PrivilegedAction內(nèi)部激活了一個EJB方法,SampleAction.java,調(dià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建立一個用戶的身份標識。WebLogic的Authorization提供程序通過一個認證Subject,并 基于定義的資源安全策略,以及認證Subject的Principal中保存的角色,賦予或者拒絕對WebLogic資源的訪問。
    posted on 2006-10-24 10:41 安文豪 閱讀(1032) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     

    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    留言簿(6)

    隨筆檔案(28)

    文章分類(3)

    文章檔案(4)

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 86493
    • 排名 - 666

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲AV无码之国产精品| 亚洲图片在线观看| 色网站在线免费观看| 国产高清免费的视频| 久久精品国产亚洲av品善| 国产精品色午夜免费视频| 亚洲av第一网站久章草| 一本色道久久88亚洲综合 | 亚洲日本在线观看| 久久久久国产精品免费免费不卡 | 免费中文字幕不卡视频| 一区二区免费国产在线观看 | 免费播放春色aⅴ视频| 一级特黄录像免费播放中文版| 亚洲欧洲自拍拍偷精品 美利坚| 精品多毛少妇人妻AV免费久久| 激情97综合亚洲色婷婷五| a级毛片无码免费真人久久| 日产亚洲一区二区三区| 免费H网站在线观看的| 色窝窝亚洲av网| 曰韩亚洲av人人夜夜澡人人爽| 久久精品无码专区免费青青| 亚洲成年人电影在线观看| 四虎影视大全免费入口| 一级毛片在线免费播放| 久久精品国产亚洲AV无码麻豆| 可以免费看黄视频的网站| 国产亚洲漂亮白嫩美女在线| 亚洲人成网站在线观看播放| 亚洲免费网站在线观看| 亚洲av综合日韩| 久久精品国产亚洲网站| 亚洲最大免费视频网| 亚洲精品国产综合久久久久紧| 国产a v无码专区亚洲av| 亚洲精品视频免费在线观看| 羞羞网站免费观看| 亚洲黄色在线电影| 亚洲国产电影av在线网址| 色se01短视频永久免费|