国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

擴(kuò)展JAAS

2019-11-18 12:22:35
字體:
供稿:網(wǎng)友

  用戶認(rèn)證和訪問控制是大多數(shù)java應(yīng)用的重要安全尺度,非凡是J2EE應(yīng)用。Java認(rèn)證和權(quán)限服務(wù)(即JAAS),J2SE1.4和1.5的核心API,描繪表達(dá)了新的安全標(biāo)準(zhǔn)。其提供了一個可插拔的(pluggable)和富有彈性的(flexible)框架(framework)答應(yīng)開發(fā)者混合不同的安全機(jī)制和豐富的已經(jīng)存在各種安全方面的資源。
  伴隨著即將來臨的J2SE1.5版本的發(fā)布,它包含了許多諸如加密技術(shù)、xml安全性、公鑰機(jī)制(PKI)、Kerberos (是一個網(wǎng)絡(luò)附加系統(tǒng)/協(xié)議,可以答應(yīng)用戶通過一個安全伺服器的服務(wù)來驗證 自己。象遠(yuǎn)端登陸,遠(yuǎn)端拷貝,系統(tǒng)間的相互檔拷貝和另外高風(fēng)險任務(wù)的服務(wù)將被變 得相當(dāng)安全和可控制。)和結(jié)盟認(rèn)證(the federating identity)的增強(qiáng)!,JAAS將會在J2EE實現(xiàn)中扮演一個更加重要的角色。
  
  認(rèn)證
  認(rèn)證就是校驗一個用戶擁有使用已經(jīng)被企業(yè)用戶注冊機(jī)構(gòu)證實了的身份鑒定的權(quán)限的處理過程。JAAS的認(rèn)證機(jī)制建立于一整套可插拔的模塊(參看圖1)基礎(chǔ)上。JAAS答應(yīng)不同的驗證模型在運(yùn)行時可被插拔。客戶應(yīng)用總是通過登陸上下文對象和JAAS交互。
  認(rèn)證處理過程典型的要經(jīng)過下面的步驟:
  1、 生成一個LoginContext對象。這個LoginContext尋找配置文件以決定使用那個LoginModule。同樣,可選擇的,有可能傳遞一個CallbackHandler給LoginContext.
  2、 通過調(diào)用LoginContext的login方法執(zhí)行認(rèn)證,它會加載預(yù)定義的LoginModule去檢驗是否用戶可以被認(rèn)證。
  3、 假如用戶被認(rèn)證,那么用規(guī)則和標(biāo)識和其所屬項進(jìn)行關(guān)聯(lián)。
  4、 或者在登陸失敗的情況下跑出一個LoginException
  5、 使用LoginContext的logout方法進(jìn)行注銷登陸
  
  在JAAS中,登陸是一個兩階段(two-phase)的處理過程。第一階段是“登陸(login)”階段(就像上面2所描述的)。這個階段唯一的任務(wù)是認(rèn)證。只要處理過程成功通過這個階段,認(rèn)證處理過程就進(jìn)入了“提交(commit)”階段(如上步驟3),這一階段LoginModule的commit方法被調(diào)用去關(guān)聯(lián)所屬子項相關(guān)的規(guī)則和標(biāo)識。
  在JAAS中一個所屬子項表示一個認(rèn)證實體,比如一個人或者一臺設(shè)備。它包含了一整套法則和安全相關(guān)的屬性諸如密碼和加密密鑰。在JAAS體系結(jié)構(gòu)中,所屬子項和其所附屬的相關(guān)權(quán)限,扮演了重要的角色在認(rèn)證過程當(dāng)中。所有的認(rèn)證模塊當(dāng)中,LoginModule是事實上的認(rèn)證機(jī)制的借口。雖然LoginModule決沒有得到直接調(diào)用客戶應(yīng)用的機(jī)會,但是他經(jīng)由一個可插拔的模塊提供了一個認(rèn)證的具體類型,其實現(xiàn)了認(rèn)證的算法并且決定實際的認(rèn)證過程是怎樣被執(zhí)行的。
  SUN提供了幾個默認(rèn)的LoginModule 實現(xiàn),在sun.com.security.auth.module包里有諸如JndiLoginModule,Krb2LoginModule,UnixLoginModule和NTLoginModule等幾個LoginModule實現(xiàn)。因為JAAS登錄結(jié)構(gòu)體系是可擴(kuò)展的,所以你只要在配置文件中指定使用哪個LoginModule模塊就可以幾乎全部插入任何LoginModule模塊。
  如下即為一個配置文件的例子:
  MySample {
  com.sample.module.MyLoginModule required debug=true;
  };
  
  這里MySample是登錄上下文環(huán)境(login context)的名字,當(dāng)你生成一個新的LoginContext開始認(rèn)證過程時它會被傳入LoginContex的構(gòu)造函數(shù)中。依據(jù)配置塊提示,那個文本塊提醒JAAS有關(guān)LoginModule在登錄過程中應(yīng)該被用來執(zhí)行認(rèn)證。另外,對于LoginModule,任何關(guān)于他的選項也可以在這里被指定。在執(zhí)行登錄這一步驟的過程中,CallbackHandler類被LoginModule類用來跟用戶通信已便于取得認(rèn)證信息。CallbackHandler類處理三種類型的回調(diào)(Callback):NameCallback,提示用戶輸入一個用戶名;PassWordCallcack,提示輸入密碼;TextOutputCallback,報告錯誤、警告或則發(fā)送給用戶一些其他信息。
  
  授權(quán)是決定是否認(rèn)證的用戶可以執(zhí)行一些動作的工作,例如訪問一處資源。因為JAAS建立于已經(jīng)存在的Java安全模型的基礎(chǔ)上,故這個過程時基于策略的。策略配置文件實質(zhì)上包含了一系列的入口,諸如“Keystore”和/或“grant”.
  grant入口包含了所有的權(quán)限,他是通過認(rèn)證的代碼或則法則被授予可以進(jìn)行安全敏感的操作,例如,訪問一個具體的Web頁面或則本地的文件。JAAS支持基于法則的策略入口,賦權(quán)入口基本格式如下:
  grant Codebase “codebase_URL” Signedby “signer_name,”
  PRincipal principal_class_name “principal_name”,
  Principal principal_class_name “principal_name”,
  … {
  permission permission_class_name “target_name”, “action”,
  permission permission_class_name “target_name”, “action”,
  …
  }
  
  上面格式中“動作(action)”可能是必需的或則可能被忽略依靠于權(quán)限類型。在JAAS體系結(jié)構(gòu)中,策略對象表達(dá)了一個Java應(yīng)用環(huán)境的系統(tǒng)安全策略和在任何時間事實上只有一個策略對象。依據(jù)Java2 SDK文檔,默認(rèn)的策略實現(xiàn)是sun.security.provider.PolicyFile,其中策略被指定在一個或多個策略配置文件里。
  只要用戶被認(rèn)證,授權(quán)經(jīng)由Subject.doAs方法發(fā)生,或者從Subject類的靜態(tài)方法doasprivileged,doAS方法用當(dāng)前的accessControlContext動態(tài)和子項并且同時調(diào)用run方法去執(zhí)行動作,他導(dǎo)致安全驗證。權(quán)限驗證過程通過下面的步驟在圖2:
  就像LoginModule,策略也是可插拔的模型。你可以掛上其它的策略實現(xiàn)通過在java.security的屬性文件中改變“policy.provider=sun.security.provider.PolicyFile”
  到一個你項使用的策略類。
  
  Extend JAAS
  JAAS建立于已經(jīng)存在的Java安全模型的頂端,其基于“CodeSource”和平面文本格式策略文件實現(xiàn)。這可能對企業(yè)應(yīng)用是不夠用的,你可能想使用可定制的安全倉庫。對于JAAS的其它實現(xiàn),諸如LDAP(輕型目錄訪問協(xié)議),數(shù)據(jù)庫或者其他文件系統(tǒng),它可以通過編寫你自己的可定制模塊被完成,感謝JAAS的可插拔的特性。然而,這需要對模塊和JAAS中的處理過程有完善的理解,同時你必須做許多編碼去覆寫相關(guān)的類,并且處理好配置和策略兩種文件。
  理想情況下,我們愿意能夠擴(kuò)展JAAS以一個更加輕易的方式以便于無論何時一個可定制的安全知識庫或者不同的訪問控制機(jī)制改變或者必須去增加時,你能夠只開發(fā)和插入這些不同的小模塊(即,適配器)去適應(yīng)這些新的變化和需求,并且在最好的情況下,不必去理解和熟悉JAAS處理過程的細(xì)節(jié),同樣,我們也愿意能夠去做這些變化僅僅通過改變一個配置文件。另一個目標(biāo)是我們的JAAS擴(kuò)展組件能夠被使用在不同的J2EE應(yīng)用中—獨(dú)立的或者Web上的。圖3描述了JAAS擴(kuò)展組件的設(shè)計意圖。我們的JAAS擴(kuò)展組在實現(xiàn)可定制的LoginModule和策略模塊時充分件利用了JAAS插拔式的體系結(jié)構(gòu)。這些模塊中,我們委派數(shù)據(jù)請求到適配器。這些適配器的每個對于諸如數(shù)據(jù)取回的簡單任務(wù)是隔離的,所以你可以快速地使用不同的安全知識或者算法開發(fā)不同的適配器而不是嘗試去實現(xiàn)不同的LoginModule或者策略模塊,它們更加復(fù)雜并且需要更多的努力。
  你可以從www.sys-con.com/java/sourcec.cfm.下在完整的源瑪。
  
  實現(xiàn)的AuthLoginModule類
  AuthLoginModule類是我們定制的LoginModule實現(xiàn),LoginModule類是在JAAS中是一個可插拔組件并且服務(wù)于兩個目的:
  1、鑒定認(rèn)證用戶
  2、假如認(rèn)證成公,則用相關(guān)的負(fù)責(zé)人信息或者證書更新主題。
  
  LoginModule有5個方法去實現(xiàn)功能,讓我們關(guān)注一下login()方法。這個方法被調(diào)用以認(rèn)證主題并且主要作兩件事情:
  1、包含用戶名和密碼,典型地,LoginModule要調(diào)用CallbackHandler類的handle方法去得到用戶名和密碼
  2、通過和數(shù)據(jù)源中的比較校驗密碼。LoginModule從Callbacks取回用戶名和密碼。(其默認(rèn)期望用戶接口的某種排序),這一點(diǎn)對于一個簡單的演示程序或者就在命令行,可是他對于一個J2EE應(yīng)用來說不太實用,例如,對于大多數(shù)的Web應(yīng)用,用戶名和密碼將比較典型的從一個form中讀出。在這種情況下,使用JAAS認(rèn)證會比較困難。考慮我們不直接使用LoginModule,解決方案是實現(xiàn)一個可定制的CallbackHandler類,他會接收用戶名和密碼然后遞交它們給LoginModule,所以他沒有必要提示用戶輸入信息
  
  以下示例説明用戶信息如何從jsp或者Servlet中傳遞:
  String userName = request.getParameter (“user”);
  String password = request.getParameter(“password”);
  LoginContext context = new LoginContext (“MySample”,
  new AuthCallbackHandler (userName, password));
  
  一旦擁有了用戶名和密碼在手,AuthLoginModule類,我們的LoginModule類的定制實現(xiàn),會經(jīng)由LoginSourceAdapterFactory實例化LoginSourceAdapter并同時委派實際的認(rèn)證過程到資源適配器。適配器只不過是一個簡單的類,其從一個具體的數(shù)據(jù)適配器(比如數(shù)據(jù)庫或者LDAP,或者一些別的系統(tǒng))領(lǐng)取用戶信息。在“提交”階段,AuthLoginModule類從LoginSourceAdapter類取回相關(guān)的信息并且把他們和主題相關(guān)聯(lián)。
  
  LoginSourceAdapter類
  LoginSourceAdapter類是一個認(rèn)證目的的資源適配器的接口,它有4個需要實現(xiàn)的方法:
  1、void initialize(Hashtable parameters):initialized方法被調(diào)用來以相關(guān)的參數(shù)初始化適配器。此方法在對象生成后立即被調(diào)用并且優(yōu)先于任何對其他方法的調(diào)用。
  2、boolean authenticate(String username,char[] password):此認(rèn)證方法被調(diào)用來認(rèn)證用戶。
  3. String[] getGroupNames (String userName):getGroupNames方法被調(diào)用來在認(rèn)證成功后得到相關(guān)的主要信息。
  4. void terminate ():這個方法在LoginModule類的logout方法被執(zhí)行后調(diào)用,它給適配器做一些清理工作的機(jī)會。
  
  AuthPoli

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 新津县| 应城市| 扬州市| 石棉县| 孟村| 晋江市| 西充县| 泽州县| 原阳县| 曲水县| 温宿县| 洛扎县| 延庆县| 华池县| 长岭县| 辽中县| 丰原市| 乐至县| 唐海县| 株洲市| 南陵县| 古浪县| 延吉市| 仁布县| 拉孜县| 金塔县| 大足县| 南华县| 彰化县| 大姚县| 沅陵县| 新津县| 高邮市| 托里县| 蒲江县| 鲜城| 阿巴嘎旗| 汝南县| 文山县| 福海县| 同仁县|