欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
JAAS編程指南(前篇)
Java Authentication Authorization Service(JAAS,Java驗證和授權API)提供了靈活和可伸縮的機制來(lái)保證客戶(hù)端或服務(wù)器端的Java程序。Java早期的安全框架強調的是通過(guò)驗證代碼的來(lái)源和作者,保護用戶(hù)避免受到下載下來(lái)的代碼的攻擊。JAAS強調的是通過(guò)驗證誰(shuí)在運行代碼以及他/她的權限來(lái)保護系統面受用戶(hù)的攻擊。它讓你能夠將一些標準的安全機制,例如Solaris NIS(網(wǎng)絡(luò )信息服務(wù))、Windows NT、LDAP(輕量目錄存取協(xié)議),Kerberos等通過(guò)一種通用的,可配置的方式集成到系統中。本文首先向你介紹JAAS驗證中的一些核心部分,然后通過(guò)例子向你展示如何開(kāi)發(fā)登錄模塊。
你是否曾經(jīng)需要為一個(gè)應用程序實(shí)現登錄模塊呢?如果你是一個(gè)比較有經(jīng)驗的程序員,相信你這樣的工作做過(guò)很多次,而且每次都不完全一樣。你有可能把你的登錄模塊建立在Oracle數據庫的基礎上,也有可能使用的是NT的用戶(hù)驗證,或者使用的是LDAP目錄。如果有一種方法可以在不改變應用程序級的代碼的基礎上支持上面提到的所有這一些安全機制,對于程序員來(lái)說(shuō)一定是一件幸運的事。
現在你可以使用JAAS實(shí)現上面的目標。JAAS是一個(gè)比較新的的Java API。在J2SE 1.3中,它是一個(gè)擴展包;在J2SE 1.4中變成了一個(gè)核心包。在本文中,我們將介紹JAAS的一些核心概念,然后通過(guò)例子說(shuō)明如何將JAAS應用到實(shí)際的程序中。本文的例子是根據我們一個(gè)基于Web的Java應用程序進(jìn)行改編的,在這個(gè)例子中,我們使用了關(guān)系數據庫保存用戶(hù)的登錄信息。由于使用了JAAS,我們實(shí)現了一個(gè)健壯而靈活的登錄和身份驗證模塊。
在JAAS出現以前,Java的安全模型是為了滿(mǎn)足跨平臺的網(wǎng)絡(luò )應用程序的需要而設計的。在Java早期版本中,Java通常是作為遠程代碼被使用,例如Applet,。因此最初的安全模型把注意力放在通過(guò)驗證代碼的來(lái)源來(lái)保護用戶(hù)上。早期的Java安全機制中包含的概念,如SercurityManager,沙箱概念,代碼簽名,策略文件,多是為了保護用戶(hù)。
JAAS的出現反映了Java的演變。傳統的服務(wù)器/客戶(hù)端程序需要實(shí)現登錄和存取控制,JAAS通過(guò)對運行程序的用戶(hù)的進(jìn)行驗證,從而達到保護系統的目的。雖然JAAS同時(shí)具有驗證和授權的能力,在這篇文章中,我們主要介紹驗證功能。
通過(guò)在應用程序和底層的驗證和授權機制之間加入一個(gè)抽象層,JAAS可以簡(jiǎn)化涉及到Java Security包的程序開(kāi)發(fā)。抽象層獨立于平臺的特性使開(kāi)發(fā)人員可以使用各種不同的安全機制,而且不用修改應用程序級的代碼。和其他Java Security API相似,JAAS通過(guò)一個(gè)可擴展的框架:服務(wù)提供者接口(Service Provider Interface,SPI)來(lái)保證程序獨立于安全機制。服務(wù)提供者接口是由一組抽象類(lèi)和接口組成的。圖一中給出了JAAS程序的整體框架圖。應用程序級的代碼主要處理LoginContext。在LoginContext下面是一組動(dòng)態(tài)配置的LoginModules。LoginModule使用正確的安全機制進(jìn)行驗證。
圖一給出了JAAS的概覽。應用程序層的代碼只需要和LoginContext打交道。在LoginContext之下是一組動(dòng)態(tài)配置的LoginModule對象,這些對象使用相關(guān)的安全基礎結構進(jìn)行驗證操作。
圖一 JAAS概覽
JAAS提供了一些LoginModule的參考實(shí)現代碼,比如JndiLoginModule。開(kāi)發(fā)人員也可以自己實(shí)現LoginModule接口,就象在我們例子中的RdbmsLonginModule。同時(shí)我們還會(huì )告訴你如何使用一個(gè)簡(jiǎn)單的配置文件來(lái)安裝應用程序。
為了滿(mǎn)足可插接性,JAAS是可堆疊的。在單一登錄的情況下,一組安全模塊可以堆疊在一起,然后被其他的安全機制按照堆疊的順序被調用。
JAAS的實(shí)現者根據現在一些流行的安全結構模式和框架將JASS模型化。例如可堆疊的特性同Unix下的可堆疊驗證模塊(PAM,Pluggable Authentication Module)框架就非常相似。從事務(wù)的角度看,JAAS類(lèi)似于雙步提交(Two-Phase Commit,2PC)協(xié)議的行為。JAAS中安全配置的概念(包括策略文件(Police File)和許可(Permission))來(lái)自于J2SE 1.2。JAAS還從其他成熟的安全框架中借鑒了許多思想。
在使用JAAS之前,你首先需要安裝JAAS。在J2SE 1.4中已經(jīng)包括了JAAS,但是在J2SE 1.3中沒(méi)有。如果你希望使用J2SE 1.3,你可以從SUN的官方站點(diǎn)上下載JAAS。當正確安裝了JAAS后,你會(huì )在安裝目錄的lib目錄下找到j(luò )aas.jar。你需要將該路徑加入Classpath中。(注:如果你安裝了應用服務(wù)器,其中就已經(jīng)包括了JAAS,請閱讀應用服務(wù)器的幫助文檔以獲得更詳細的信息)。在Java安全屬性文件java.security中,你可以改變一些與JAAS相關(guān)的系統屬性。該文件保存在<jre_home>/lib/security目錄中。
JAAS的核心類(lèi)和接口可以被分為三種類(lèi)型,大多數都在javax.security.auth包中。在J2SE 1.4中,還有一些接口的實(shí)現類(lèi)在com.sun.security.auth包中,如下所示:
u       普通類(lèi) Subject,Principal,Credential(憑證)
Subject類(lèi)代表了一個(gè)驗證實(shí)體,它可以是用戶(hù)、管理員、Web服務(wù),設備或者其他的過(guò)程。該類(lèi)包含了三中類(lèi)型的安全信息:
1)        身份(Identities):由一個(gè)或多個(gè)Principal對象表示
2)        公共憑證(Public credentials):例如名稱(chēng)或公共密鑰
3)        私有憑證(Private credentials):例如口令或私有密鑰
Principal對象代表了Subject對象的身份。它們實(shí)現了java.security.Principal和java.io.Serializable接口。在Principal類(lèi)中,最重要的方法是getName()。該方法返回一個(gè)身份名稱(chēng)。在Subject對象中包含了多個(gè)Principal對象,因此它可以擁有多個(gè)名稱(chēng)。由于登錄名稱(chēng)、身份證號和Email地址都可以作為用戶(hù)的身份標識,可見(jiàn)擁有多個(gè)身份名稱(chēng)的情況在實(shí)際應用中是非常普遍的情況。
在上面提到的憑證并不是一個(gè)特定的類(lèi)或借口,它可以是任何對象。憑證中可以包含任何特定安全系統需要的驗證信息,例如標簽(ticket),密鑰或口令。Subject對象中維護著(zhù)一組特定的私有和公有的憑證,這些憑證可以通過(guò)Subject 方法getPrivateCredentials()和getPublicCredentials()獲得。這些方法通常在應用程序層中的安全子系統被調用。
u       驗證 LoginContext,LoginModule,CallBackHandler,Callback
驗證:LoginContext
在應用程序層中,你可以使用LoginContext對象來(lái)驗證Subject對象。LoginContext對象同時(shí)體現了JAAS的動(dòng)態(tài)可插入性(Dynamic Pluggability),因為當你創(chuàng )建一個(gè)LoginContext的實(shí)例時(shí),你需要指定一個(gè)配置。LoginContext通常從一個(gè)文本文件中加載配置信息,這些配置信息告訴LoginContext對象在登錄時(shí)使用哪一個(gè)LoginModule對象。
下面列出了在LoginContext中經(jīng)常使用的三個(gè)方法:
n         login () 進(jìn)行登錄操作。該方法激活了配置中制定的所有LoginModule對 象。如果成功,它將創(chuàng )建一個(gè)經(jīng)過(guò)了驗證的Subject對象;否則拋出LoginException異常。
n         getSubject () 返回經(jīng)過(guò)驗證的Subject對象
n         logout () 注銷(xiāo)Subject對象,刪除與之相關(guān)的Principal對象和憑證
驗證:LoginModule
LoginModule是調用特定驗證機制的接口。J2EE 1.4中包含了下面幾種LoginModule的實(shí)現類(lèi):
n         JndiLoginModule 用于驗證在JNDI中配置的目錄服務(wù)
n         Krb5LoginModule 使用Kerberos協(xié)議進(jìn)行驗證
n         NTLoginModul 使用當前用戶(hù)在NT中的用戶(hù)信息進(jìn)行驗證
n         UnixLoginModule 使用當前用戶(hù)在Unix中的用戶(hù)信息進(jìn)行驗證
同上面這些模塊綁定在一起的還有對應的Principal接口的實(shí)現類(lèi),例如NTDomainPrincipal和UnixPrincipal。這些類(lèi)在com.sun.security.auth包中。
LoginModule接口中包含了五個(gè)方法:
1)        initialize () 當創(chuàng )建一LoginModule實(shí)例時(shí)會(huì )被構造函數調用
2)        login () 進(jìn)行驗證,通常會(huì )按照登錄條件生成若干個(gè)Principal對象
3)        commit () 進(jìn)行Principal對象檢驗,按照預定義Principal條件檢驗Login生成的Principal對象,所有需要的條件均符合后,把若干個(gè)生成的Principal對象付給Subject對象,JAAS架構負責回傳給LoginContext.
4)        abort () 當任何一個(gè)LoginModule對象驗證失敗時(shí)都會(huì )調用該方法。任何已經(jīng)和Subject對象綁定的Principal對象都會(huì )被解除綁定。
5)        logout () 刪除與Subject對象關(guān)聯(lián)的Principal對象和憑證,消除Subject,Principal等認證對象。
驗證:CallbackHandler和Callback
CallbackHandler和Callback對象可以使LoginModule對象從系統和用戶(hù)那里收集必要的驗證信息,同時(shí)獨立于實(shí)際的收集信息時(shí)發(fā)生的交互過(guò)程。
JAAS在javax.sevurity.auth.callback包中包含了七個(gè)Callback的實(shí)現類(lèi)和兩個(gè)CallbackHandler的實(shí)現類(lèi):ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只會(huì )在客戶(hù)端會(huì )被使用到。我將在后面介紹如何編寫(xiě)你自己的CallbackHandler類(lèi)。
u       授權 Policy,AuthPermission,PrivateCredentialPermission
在應用程序中使用JAAS驗證通常會(huì )涉及到以下幾個(gè)步驟,如下圖所示:
1)        創(chuàng )建一個(gè)LoginContext的實(shí)例。
2)        為了能夠獲得和處理驗證信息,客戶(hù)端將若干個(gè)CallBackHandler對象作為參數傳送給LoginContext。
3)        JAAS通過(guò)配置文件查到相關(guān)的LoginModule處理類(lèi)。
4)        通過(guò)調用LoginContext的login()方法來(lái)進(jìn)行驗證,此處會(huì )回調所有傳入CallBackHandler的handle()方法,該方法通常會(huì )從外部收集一些被驗證信息。
5)        通過(guò)使用login()方法返回的Subject對象實(shí)現一些特殊的功能(假設登錄成功)。
下面是一個(gè)簡(jiǎn)單的例子用來(lái)說(shuō)明以上的情況:
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.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
在運行這段代碼時(shí),后臺進(jìn)行了以下的工作。
2)        當初始化時(shí),LoginContext對象首先在JAAS配置文件jaas.config中找到MyExample項,然后更具該項的內容決定該加載哪個(gè)LoginModule對象(參見(jiàn)圖二)。
3)        在登錄時(shí),LoginContext對象調用每個(gè)LoginModule對象的login()方法。
4)        每個(gè)login()方法進(jìn)行驗證操作或獲得一個(gè)CallbackHandle對象。
5)        CallbackHandle對象通過(guò)使用一個(gè)或多個(gè)CallBack方法同用戶(hù)進(jìn)行交互,獲得用戶(hù)輸入。
6)        向一個(gè)新的Subject對象中填入驗證信息。
要使上述例子順利運行,還需要有相關(guān)的JAAS配置文件進(jìn)行配置。
圖二描述了配置文件中各元素之間的關(guān)系
圖二 JAAS的配置文件
上面我已經(jīng)提到,JAAS的可擴展性來(lái)源于它能夠進(jìn)行動(dòng)態(tài)配置,而配置信息通常是保存在文本。這些文本文件有很多個(gè)配置塊構成,我們通常把這些配置塊稱(chēng)作申請(Application)。每個(gè)申請對應了一個(gè)或多個(gè)特定的LoginModule對象。
當你的代碼構造一個(gè)LoginContext對象時(shí),你需要把配置文件中申請的名稱(chēng)傳遞給它。LoginContext將會(huì )根據申請中的信息決定激活哪些LoginModule對象,按照什么順序激活以及使用什么規則激活。
配置文件的結構如下所示:
Application {
ModuleClass Flag ModuleOptions;
ModuleClass Flag ModuleOptions;
...
};
Application {
ModuleClass Flag ModuleOptions;
...
};
...
下面是一個(gè)名稱(chēng)為Sample的申請
Sample {
com.sun.security.auth.module.NTLoginModule Rquired debug=true;
}
上面這個(gè)簡(jiǎn)單的申請指定了LoginContext對象應該使用NTLoginModule進(jìn)行驗證。類(lèi)的名稱(chēng)在ModuleClass中被指定。Flag控制當申請中包含了多個(gè)LoginModule時(shí)進(jìn)行登錄時(shí)的行為:Required、Sufficient、Requisite和Optional。最常用的是Required,使用它意味著(zhù)對應的LoginModule對象必須被調用,并且必須需要通過(guò)所有的驗證。由于Flag本身的復雜性,本文在這里不作深究。
ModuleOption允許有多個(gè)參數。例如你可以設定調試參數為T(mén)rue(debug=true),這樣診斷輸出將被送到System.out中。
配置文件可以被任意命名,并且可以被放在任何位置。JAAS框架通過(guò)使用java.securty.auth.long.config屬性來(lái)確定配置文件的位置。例如當你的應用程序是JaasTest,配置文件是當前目錄下的jaas.config,你需要在命令行中輸入:
java -Djava.security.auth.login.config=jass.config JavaTest
通過(guò)命令行方式進(jìn)行登錄驗證
為了說(shuō)明JAAS到底能干什么,我在這里編寫(xiě)了兩個(gè)例子。一個(gè)是簡(jiǎn)單的由命令行輸入調用的程序,另一個(gè)是服務(wù)器端的JSP程序。這兩個(gè)程序都通過(guò)用戶(hù)名/密碼的方式進(jìn)行登錄,然后使用關(guān)系數據庫對其進(jìn)行驗證。
1)        控制臺方式實(shí)現JAAS認證
具體實(shí)現流程如下,其實(shí)只是稍微擴展了一下上面的簡(jiǎn)單的例子:
1. 實(shí)現RdbmsLoginModule類(lèi),該類(lèi)可以對輸入的信息進(jìn)行驗證。
2. 編輯一個(gè)配置文件,告訴LoginContext如何使用RdbmsLoginModule。
3. 實(shí)現ConsoleCallbackHandler類(lèi),通過(guò)該類(lèi)可以獲取用戶(hù)的輸入。
4. 編寫(xiě)應用程序代碼。
在RdbmsLoginModule類(lèi)中,我們必須實(shí)現LoginModule接口中的五個(gè)方法。首先是initialize()方法:
public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options)
{
this.subject = subject;
this.callbackHandler = callbackHandler;
this.sharedState = sharedState;
this.options = options;
url = (String)options.get("url");
driverClass = (String)options.get("driver");
debug = "true".equalsIgnoreCase((String)options.get("debug"));
}
LoginContext在調用login()方法時(shí)會(huì )調用initialize()方法。RdbmsLoginModule的第一個(gè)任務(wù)就是在類(lèi)中保存輸入參數的引用。在驗證成功后將向Subject對象中送入Principal對象和憑證。
CallbackHandler對象將會(huì )在login()方法中被使用到。sharedState可以使數據在不同的LoginModule對象之間共享,但是在這個(gè)例子中我們不會(huì )使用它。最后是名為options的Map對象。options向LgoinModule對象傳遞在配置文件ModuleOption域中定義的參數的值。配置文件simple.conf如下所示:
SimpleLogin {
com.lemon.jaas.RdbmsLoginModule required
driver="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost/jaasdb?user=root"
debug="true";
};
在配置文件中,RdbmsLoginModule包含了五個(gè)參數,其中driver、url、user和password是必需的,而debug是可選闡述。driver、url、user和password參數告訴我們如何獲得JDBC連接。當然你還可以在ModuleOption域中加入數據庫中的表或列的信息。使用這些參數的目的是為了能夠對數據庫進(jìn)行操作。在LoginModule類(lèi)的initialize()方法中我們保存了每個(gè)參數的值。
我們前面提到一個(gè)LoginContext對應的配置文件告訴它應該使用文件中的哪一個(gè)申請。這個(gè)信息是通過(guò)LgoinContext的構造函數傳遞的。下面是初始化客戶(hù)端的代碼,在代碼中創(chuàng )建了一個(gè)LoginContext對象并調用了login()方法。
LoginContext ctx = new LoginContext("SimpleLogin", new ConsoleCallbackHandler());
ctx.login();
Subject subj = ctx.getSubject();
System.out.println("Login assigned these principals: ");
Iterator it = subj.getPrincipals().iterator();
while (it.hasNext()) {
Principal pl = (Principal) it.next();
System.out.println("\t" + pl.getName());
}
Subject.doAsPrivileged(subj, new MyAction(), null);
ctx.logout();
當LgoinContext.login()方法被調用時(shí),它調用所有加載了的LoginModule對象的login()方法。在我們的這個(gè)例子中是RdbmsLoginModule中的login()方法。
RdbmsLoginModule中的login()方法進(jìn)行了下面的操作:
1. 創(chuàng )建兩個(gè)Callback對象。這些對象從用戶(hù)輸入中獲取用戶(hù)名/密碼。程序中使用了JAAS中的兩個(gè)Callback類(lèi):NameCallback和PasswordCallback(這兩個(gè)類(lèi)包含在javax.security.auth.callback包中)。
2. 通過(guò)將callbacks作為參數傳遞給CallbackHandler的handle()方法來(lái)激活Callback。
3. 通過(guò)Callback對象獲得用戶(hù)名/密碼。
4. 在rdbmsValidate()方法中通過(guò)JDBC在數據庫中驗證獲取的用戶(hù)名/密碼,這里省略。
下面是RdbmsLoginModule中的login()方法的代碼
public boolean login() throws LoginException {
if (callbackHandler == null)
throw new LoginException("no handler");
NameCallback nameCb = new NameCallback("user: ");
PasswordCallback passCb = new PasswordCallback("password: ", true);
callbacks = new Callback[] { nameCb, passCb };
callbackHandler.handle(callbacks);
String username = nameCb.getName();
String password = new String(passCb.getPassword());
success = rdbmsValidate(username, password);
return(true);
}
在ConsoleCallbackHandler類(lèi)的handle()方法中你可以看到Callback對象是如何同用戶(hù)進(jìn)行交互的:
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback nc = (NameCallback) callbacks[i];
System.err.print(nc.getPrompt());
System.err.flush();
String name = (new BufferedReader(new InputStreamReader(System.in))).readLine();
nc.setName(name);
} else if (callbacks[i] instanceof PasswordCallback) {
PasswordCallback pc = (PasswordCallback) callbacks[i];
System.err.print(pc.getPrompt());
System.err.flush();
String name = (new BufferedReader(new InputStreamReader(System.in))).readLine();
pc.setPassword(name.toCharArray());
} else {
throw(new UnsupportedCallbackException(callbacks[i], "Callback handler not support"));
}
}
}
現在啟動(dòng)這個(gè)例子:
2)        在web環(huán)境下進(jìn)行JAAS驗證
現在應用的最廣泛的系統為B/S系統,這些系統一般使用關(guān)系型數據庫來(lái)存儲應用數據。所以討論在Web環(huán)境下的JAAS使用方法,尤其有現實(shí)意義。
我們使用通用的Web技術(shù)來(lái)實(shí)現這個(gè)輸入用戶(hù)信息的過(guò)程,然后通過(guò)RdbmsLoginModule類(lèi)驗證它。我們將會(huì )使用到JSP、Servlet以及HTML表單等技術(shù)來(lái)說(shuō)明這個(gè)用例。
首先我們寫(xiě)一個(gè)Servlet類(lèi)代替之前的應用程序登錄入口類(lèi)。此類(lèi)可以命名為L(cháng)oginServlet 下面是該類(lèi)的代碼,下面代碼包括了JAAS認證和授權功能:
public class LoginServlet extends HttpServlet {
protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
String userName = httpServletRequest.getParameter("username");
String password = httpServletRequest.getParameter("password");
System.out.println("userName = " + userName);
System.out.println("password = " + password);
LoginContext ctx = null;
try {
ctx = new LoginContext("SimpleLogin", new PassiveCallbackHandler(userName,password));
ctx.login();
} catch (LoginException e) {
e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
}
Subject subj = ctx.getSubject();
System.out.println("Login assigned these principals: ");
Iterator it = subj.getPrincipals().iterator();
while (it.hasNext()) {
Principal pl = (Principal) it.next();
System.out.println("\t" + pl.getName());
}
Subject.doAsPrivileged(subj, new MyAction(), null);
try {
ctx.logout();
} catch (LoginException e) {
e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
}
}
}
從此處就可以看出我們把Servlet完全代替了應用程序的登錄入口功能,下面是很簡(jiǎn)單的JSP表單輸入代碼:
Index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Simple jsp page</title></head>
<body>
<form action="/login.do" method="post">
user:<input type="text" name="username"/>
password:<input type="password" name="password"/>
<input type="submit"/>
</form>
</body>
</html>
下面是web.xml配置文件代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.lemon.jaas.web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
因為Web端所有響應客戶(hù)端的工作都是由servlet以及jsp完成得,所以PassiveCallbackHandler代替了ConsoleCallbackHandler 直接傳入構造函數的參數包含了用戶(hù)名和密碼,取消了和客戶(hù)端交互的動(dòng)作。因此它可以在Callback對象中設定正確的值。下面是PassiveCallbackHandler類(lèi)的代碼:
public class PassiveCallbackHandler implements CallbackHandler {
private String userName; // external login info input handler  , like password input and some device input
private String password;
public PassiveCallbackHandler(String userName, String password) {
this.userName = userName;
this.password = password;
}
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { //do some
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback nc = (NameCallback) callbacks[i];
nc.setName(this.userName);
} else if (callbacks[i] instanceof PasswordCallback) {
PasswordCallback pc = (PasswordCallback) callbacks[i];
pc.setPassword(this.password.toCharArray());
} else {
throw(new UnsupportedCallbackException(callbacks[i], "Callback handler not support"));
}
}
}
}
RdbmsLoginModule無(wú)需改動(dòng)。
以上就完成了整個(gè)Web程序的調用JAAS的機制。
和在應用程序運行JAAS不同的是,配置JAAS方法會(huì )有很不一樣。我們使用的是Tomcat 5.0.x 應用服務(wù)器,它的JAAS配置方法有數種,分別是
u       JAASRealm
u       JDBCRealm
u       DataSourceRealm
u       JNDIRealm
u       MemoryRealm
JAASRealm
1.         把自定義 LoginModule、User、Role等相關(guān)類(lèi)放入Tomcat 的 classpath
2.         把自定義login.config JAAS配置文件配置進(jìn)JVM環(huán)境,例如:       JAVA_OPTS=-DJAVA_OPTS=-Djava.security.auth.login.config==$CATALINA_HOME/conf/jaas.config
3.         設置 web.xml里的 security-constraints 標簽設定需要保護的資源
4.         在$CATALINA_HOME/conf/server.xml里engine標簽里設置JAASRealm標簽
以下是JAASRealm標簽的詳細說(shuō)明
屬性
描述
className
只需要指定 org.apache.catalina.realm.JAASRealm
debug
設置debug級別,默認為不設置0
appName
JAAS配置文件應用名
userClassNames
自定義user Principals
roleClassNames
自定義 role Principals
useContextClassLoader
默認為true, 為了向后兼容類(lèi)裝載方式,使用Tomcat4以上版本ContextLoader裝載方式
以下是完整的tomcat服務(wù)器配置例子:
在%TOMCAT_HOME%/config/server.xml 中添加以下段落
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="MyFooRealm"
userClassNames="org.foobar.realm.FooUser"
roleClassNames="org.foobar.realm.FooRole"
debug="99"/>
注意Realm標簽所在位置將會(huì )使JAAS作用域不同
父標簽
作用
<Engine>
Tomcat下面所有的web application 以及所有的host
<Host>
作用于該虛擬主機上的所有web application
<Context>
僅作用于當前web application
特別感謝:
本文是在眾多前人的文章基礎上改編并且添加內容而來(lái),本文的版權屬于hk2000c以及以下列出的所有參考文檔作者以及相關(guān)譯者,僅此感謝JAVA勇敢無(wú)私的先驅者們的不懈努力與研究工作。如果您對本文有任何意見(jiàn)請在我的技術(shù)Bloghttp://blog.csdn.net/hk2000c 中和我聯(lián)絡(luò ),謝謝。
參考資料:
《JAAS:靈活的Java安全機制》 John Musser/Paul Feuer著(zhù) 馮睿編譯
《擴展JAAS實(shí)現類(lèi)實(shí)例級授權》Carlos A. Fonseca, 軟件工程師, IBMhttp://www-128.ibm.com/developerworks/cn/java/j-jaas/
《用 JAAS 和 JSSE 實(shí)現 Java 安全性》Kyle Gabhart, 顧問(wèn), Gabhart Communications
本文沒(méi)有對如何在Web Container 中具體實(shí)施JAAS作進(jìn)一步闡述,這部分將會(huì )在后篇整理刊出。
后記:
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=633091
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
jaas認證提供者 - acegi
JAAS簡(jiǎn)介及實(shí)例
擴展JAAS - [Matrix - 與 Java 共舞]
Implementing J2EE security using JAAS on JBOS...
JAAS基礎認證和授權機制
JAAS簡(jiǎn)介(轉載)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久