自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

什么是JAAS,以及靈活的Java安全機(jī)制

運(yùn)維 系統(tǒng)運(yùn)維
Java Authentication Authorization Service(JAAS,Java驗(yàn)證和授權(quán)API)提供了靈活和可伸縮的機(jī)制來(lái)保證客戶端或服務(wù)器端的Java程序。

Java Authentication Authorization Service(JAAS,Java驗(yàn)證和授權(quán)API)提供了靈活和可伸縮的機(jī)制來(lái)保證客戶端或服務(wù)器端的Java程序。Java早期的安全框架強(qiáng)調(diào)的是通過驗(yàn)證代碼的來(lái)源和作者,保護(hù)用戶避免受到下載下來(lái)的代碼的攻擊。JAAS強(qiáng)調(diào)的是通過驗(yàn)證誰(shuí)在運(yùn)行代碼以及他/她的權(quán)限來(lái)保護(hù)系統(tǒng)面受用戶的攻擊。它讓你能夠?qū)⒁恍?biāo)準(zhǔn)的安全機(jī)制,例如Solaris NIS(網(wǎng)絡(luò)信息服務(wù))、Windows NT、LDAP(輕量目錄存取協(xié)議),Kerberos等通過一種通用的,可配置的方式集成到系統(tǒng)中。

你是否曾經(jīng)需要為一個(gè)應(yīng)用程序?qū)崿F(xiàn)登錄模塊呢?如果你是一個(gè)比較有經(jīng)驗(yàn)的程序員,相信你這樣的工作做過很多次,而且每次都不完全一樣。你有可能把你的登錄模塊建立在Oracle數(shù)據(jù)庫(kù)的基礎(chǔ)上,也有可能使用的是NT的用戶驗(yàn)證,或者使用的是LDAP目錄。如果有一種方法可以在不改變應(yīng)用程序級(jí)的代碼的基礎(chǔ)上支持上面提到的所有這一些安全機(jī)制,對(duì)于程序員來(lái)說(shuō)一定是一件幸運(yùn)的事。

現(xiàn)在你可以使用JAAS實(shí)現(xiàn)上面的目標(biāo)。JAAS是一個(gè)比較新的的Java API。在J2SE 1.3中,它是一個(gè)擴(kuò)展包;在J2SE 1.4中變成了一個(gè)核心包。在本文中,我們將介紹JAAS的一些核心概念,然后通過例子說(shuō)明如何將JAAS應(yīng)用到實(shí)際的程序中。本文的例子是根據(jù)我們一個(gè)基于Web的Java應(yīng)用程序進(jìn)行改編的,在這個(gè)例子中,我們使用了關(guān)系數(shù)據(jù)庫(kù)保存用戶的登錄信息。由于使用了JAAS,我們實(shí)現(xiàn)了一個(gè)健壯而靈活的登錄和身份驗(yàn)證模塊。

客戶端和服務(wù)器端的JAAS

開發(fā)人員可以將JAAS應(yīng)用到客戶端和服務(wù)器端。在客戶端使用JAAS很簡(jiǎn)單。在服務(wù)器端使用JAAS時(shí)情況要復(fù)雜一些。目前在應(yīng)用服務(wù)器市場(chǎng)中的JAAS產(chǎn)品還不是很一致,使用JAAS的J2EE應(yīng)用服務(wù)器有一些細(xì)微的差別。例如JBossSx使用自己的結(jié)構(gòu),將JAAS集成到了一個(gè)更大的安全框架中;而雖然WebLogic 6.x也使用了JAAS,安全框架卻完全不一樣。

現(xiàn)在你能夠理解為什么我們需要從客戶端和服務(wù)器端的角度來(lái)看JAAS了。我們將在后面列出兩種情況下的例子。為了使服務(wù)器端的例子程序更加簡(jiǎn)單,我們使用了Resin應(yīng)用服務(wù)器。

核心JAAS類

在使用JAAS之前,你首先需要安裝JAAS。在J2SE 1.4中已經(jīng)包括了JAAS,但是在J2SE 1.3中沒有。如果你希望使用J2SE 1.3,你可以從SUN的官方站點(diǎn)上下載JAAS。當(dāng)正確安裝了JAAS后,你會(huì)在安裝目錄的lib目錄下找到j(luò)aas.jar。你需要將該路徑加入Classpath中。(注:如果你安裝了應(yīng)用服務(wù)器,其中就已經(jīng)包括了JAAS,請(qǐng)閱讀應(yīng)用服務(wù)器的幫助文檔以獲得更詳細(xì)的信息)。在Java安全屬性文件java.security中,你可以改變一些與JAAS相關(guān)的系統(tǒng)屬性。該文件保存在/lib/security目錄中。

在應(yīng)用程序中使用JAAS驗(yàn)證通常會(huì)涉及到以下幾個(gè)步驟:

1. 創(chuàng)建一個(gè)LoginContext的實(shí)例。
2. 為了能夠獲得和處理驗(yàn)證信息,將一個(gè)CallBackHandler對(duì)象作為參數(shù)傳送給LoginContext。
3. 通過調(diào)用LoginContext的login()方法來(lái)進(jìn)行驗(yàn)證。
4. 通過使用login()方法返回的Subject對(duì)象實(shí)現(xiàn)一些特殊的功能(假設(shè)登錄成功)。
下面是一個(gè)簡(jiǎn)單的例子:
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
0  Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
在運(yùn)行這段代碼時(shí),后臺(tái)進(jìn)行了以下的工作。
1. 當(dāng)初始化時(shí),LoginContext對(duì)象首先在JAAS配置文件中找到MyExample項(xiàng),然后更具該項(xiàng)的內(nèi)容決定該加載哪個(gè)LoginModule對(duì)象。
2. 在登錄時(shí),LoginContext對(duì)象調(diào)用每個(gè)LoginModule對(duì)象的login()方法。
3. 每個(gè)login()方法進(jìn)行驗(yàn)證操作或獲得一個(gè)CallbackHandle對(duì)象。
4. CallbackHandle對(duì)象通過使用一個(gè)或多個(gè)CallBack方法同用戶進(jìn)行交互,獲得用戶輸入。
5. 向一個(gè)新的Subject對(duì)象中填入驗(yàn)證信息。
我們將對(duì)代碼作進(jìn)一步的解釋。但是在這之前,讓我們先看代碼中涉及到的核心JAAS類和接口。這些類可以被分為三種類型:
普通類型 Subject,Principal,憑證
驗(yàn)證 LoginContext,LoginModule,CallBackHandler,Callback
授權(quán) Policy,AuthPermission,PrivateCredentialPermission
上面列舉的類和接口大多數(shù)都在javax.security.auth包中。在J2SE 1.4中,還有一些接口的實(shí)現(xiàn)類在com.sun.security.auth包中。
普通類型:Subject,Principal,憑證
Subject類代表了一個(gè)驗(yàn)證實(shí)體,它可以是用戶、管理員、Web服務(wù),設(shè)備或者其他的過程。該類包含了三中類型的安全信息:
身份(Identities):由一個(gè)或多個(gè)Principal對(duì)象表示
公共憑證(Public credentials):例如名稱或公共秘鑰
私有憑證(Private credentials):例如口令或私有密鑰
Principal對(duì)象代表了Subject對(duì)象的身份。它們實(shí)現(xiàn)了java.security.Principal和java.io.Serializable接口。在Subject類中,最重要的方法是getName()。該方法返回一個(gè)身份名稱。在Subject對(duì)象中包含了多個(gè)Principal對(duì)象,因此它可以擁有多個(gè)名稱。由于登錄名稱、身份證號(hào)和Email地址都可以作為用戶的身份標(biāo)識(shí),可見擁有多個(gè)身份名稱的情況在實(shí)際應(yīng)用中是非常普遍的情況。

在上面提到的憑證并不是一個(gè)特定的類或借口,它可以是任何對(duì)象。憑證中可以包含任何特定安全系統(tǒng)需要的驗(yàn)證信息,例如標(biāo)簽(ticket),密鑰或口令。Subject對(duì)象中維護(hù)著一組特定的私有和公有的憑證,這些憑證可以通過getPrivateCredentials()和getPublicCredentials()方法獲得。這些方法通常在應(yīng)用程序?qū)又械陌踩酉到y(tǒng)被調(diào)用。

驗(yàn)證:LoginContext

在應(yīng)用程序?qū)又?,你可以使用LoginContext對(duì)象來(lái)驗(yàn)證Subject對(duì)象。LoginContext對(duì)象同時(shí)體現(xiàn)了JAAS的動(dòng)態(tài)可插入性(Dynamic Pluggability),因?yàn)楫?dāng)你創(chuàng)建一個(gè)LoginContext的實(shí)例時(shí),你需要指定一個(gè)配置。LoginContext通常從一個(gè)文本文件中加載配置信息,這些配置信息告訴LoginContext對(duì)象在登錄時(shí)使用哪一個(gè)LoginModule對(duì)象。

下面列出了在LoginContext中經(jīng)常使用的三個(gè)方法:

login () 進(jìn)行登錄操作。該方法激活了配置中制定的所有LoginModule對(duì)象。如果成功,它將創(chuàng)建一個(gè)經(jīng)過了驗(yàn)證的Subject對(duì)象;否則拋出LoginException異常。
getSubject () 返回經(jīng)過驗(yàn)證的Subject對(duì)象
logout () 注銷Subject對(duì)象,刪除與之相關(guān)的Principal對(duì)象和憑證
驗(yàn)證:LoginModule
LoginModule是調(diào)用特定驗(yàn)證機(jī)制的接口。J2EE 1.4中包含了下面幾種LoginModule的實(shí)現(xiàn)類:
JndiLoginModule 用于驗(yàn)證在JNDI中配置的目錄服務(wù)
Krb5LoginModule 使用Kerberos協(xié)議進(jìn)行驗(yàn)證
NTLoginModul 使用當(dāng)前用戶在NT中的用戶信息進(jìn)行驗(yàn)證
UnixLoginModule 使用當(dāng)前用戶在Unix中的用戶信息進(jìn)行驗(yàn)證
同上面這些模塊綁定在一起的還有對(duì)應(yīng)的Principal接口的實(shí)現(xiàn)類,例如NTDomainPrincipal和UnixPrincipal。這些類在com.sun.security.auth包中。
LoginModule接口中包含了五個(gè)方法:
initialize () 當(dāng)創(chuàng)建一LoginModule實(shí)例時(shí)會(huì)被構(gòu)造函數(shù)調(diào)用
login () 進(jìn)行驗(yàn)證

commit () 當(dāng)LgoninContext對(duì)象接受所有LoginModule對(duì)象傳回的結(jié)果后將調(diào)用該方法。該方法將Principal對(duì)象和憑證賦給Subject對(duì)象。

abort () 當(dāng)任何一個(gè)LoginModule對(duì)象驗(yàn)證失敗時(shí)都會(huì)調(diào)用該方法。此時(shí)沒有任何Principal對(duì)象或憑證關(guān)聯(lián)到Subject對(duì)象上。

logout () 刪除與Subject對(duì)象關(guān)聯(lián)的Principal對(duì)象和憑證。

在應(yīng)用程序的代碼中,程序員通常不會(huì)直接調(diào)用上面列出的方法,而是通過LigonContext間接調(diào)用這些方法。

驗(yàn)證:CallbackHandler和Callback
CallbackHandler和Callback對(duì)象可以使LoginModule對(duì)象從系統(tǒng)和用戶那里收集必要的驗(yàn)證信息,同時(shí)獨(dú)立于實(shí)際的收集信息時(shí)發(fā)生的交互過程。

JAAS在javax.sevurity.auth.callback包中包含了七個(gè)Callback的實(shí)現(xiàn)類和兩個(gè)CallbackHandler的實(shí)現(xiàn)類:

ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只會(huì)在客戶端會(huì)被使用到。我將在后面介紹如何編寫你自己的CallbackHandler類。

責(zé)任編輯:符甲 來(lái)源: 轉(zhuǎn)自ITPUB論壇
相關(guān)推薦

2023-07-20 10:59:04

2023-06-27 08:37:35

Java反射動(dòng)態(tài)代理機(jī)制

2013-03-28 16:12:12

Message機(jī)制應(yīng)用

2009-08-05 15:37:50

什么是RESTRESTful的實(shí)現(xiàn)

2009-07-02 09:13:25

什么是JSPServlet

2022-10-21 14:12:06

2010-09-08 09:40:19

SIP協(xié)議是什么

2014-07-24 09:50:55

Unix開源系統(tǒng)

2009-06-29 17:10:24

什么是JSP

2023-05-05 14:45:05

2025-03-10 01:00:00

Spring參數(shù)解析器

2018-08-26 22:25:36

自注意力機(jī)制神經(jīng)網(wǎng)絡(luò)算法

2010-08-13 13:56:02

Flex事件機(jī)制

2011-07-26 14:35:02

Windows 200安全模式

2023-06-01 19:24:16

2022-05-27 12:22:56

物聯(lián)網(wǎng)物聯(lián)網(wǎng)安全

2024-01-26 08:06:43

2012-02-08 09:53:25

Java反射

2023-07-03 11:38:48

2022-02-27 15:28:53

大數(shù)據(jù)挑戰(zhàn)戰(zhàn)略
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)