• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于JAAS安全機(jī)制的J2EE Web系統(tǒng)用戶身份認(rèn)證設(shè)計(jì)

    2011-02-20 00:54:10劉景林
    關(guān)鍵詞:用戶名配置文件密碼

    劉景林

    (泉州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院信息技術(shù)系, 福建 泉州 362000)

    0 引 言

    隨著Java技術(shù)應(yīng)用的不斷普及,J2EE已日漸成為企業(yè)級軟件開發(fā)的首選平臺,基于J2EE架構(gòu)的Web系統(tǒng)廣泛應(yīng)用于電子政務(wù)、電子商務(wù)及網(wǎng)上銀行等其他安全性要求較高的領(lǐng)域,但由于Internet中存在諸多不安全因素,對于在實(shí)現(xiàn)網(wǎng)上業(yè)務(wù)的同時(shí),如何提高系統(tǒng)用戶認(rèn)證和數(shù)據(jù)傳輸?shù)确矫娴陌踩珕栴},已成為系統(tǒng)開發(fā)人員關(guān)注的重點(diǎn),關(guān)于J2EE架構(gòu)安全方面的研究也在不斷地深入.JAAS技術(shù)作為Java2安全體系結(jié)構(gòu)的一個(gè)重要組成部分,其主要功能是實(shí)現(xiàn)用戶認(rèn)證與訪問控制.JAAS認(rèn)證是建立在可插入的認(rèn)證模塊PAM(Pluggable Authentication Module)的安全體系結(jié)構(gòu)之上的[1],PAM是模塊化的,可以集成多種認(rèn)證技術(shù),這可使J2EE應(yīng)用系統(tǒng)獨(dú)立于底層的認(rèn)證技術(shù),方便其靈活地選擇與修改所使用的認(rèn)證技術(shù),也可以實(shí)現(xiàn)多種認(rèn)證機(jī)制的堆疊認(rèn)證,該認(rèn)證技術(shù)提供了一種實(shí)現(xiàn)J2EE Web系統(tǒng)安全認(rèn)證的解決方案.

    1 JAAS安全認(rèn)證機(jī)制

    1.1 JAAS概述

    JAAS(Java Authentication and Authorization Service)是J2EE架構(gòu)的驗(yàn)證與授權(quán)框架,它提供了靈活、可伸縮的實(shí)體認(rèn)證與訪問控制的安全機(jī)制,解決了安全管理系統(tǒng)中的認(rèn)證與授權(quán)問題.JAAS側(cè)重于通過驗(yàn)證運(yùn)行代碼的用戶及其權(quán)限來保護(hù)系統(tǒng)免受攻擊,通過在應(yīng)用程序和底層的驗(yàn)證與授權(quán)機(jī)制之間加入一個(gè)抽象層,該抽象層具有獨(dú)立于平臺的特性,使得各種不同的安全機(jī)制和應(yīng)用程序級代碼隔離,從而支持多種不同的安全認(rèn)證方式[2].JAAS技術(shù)可以實(shí)現(xiàn)應(yīng)用程序獨(dú)立于底層的認(rèn)證機(jī)制,應(yīng)用程序可以使用一個(gè)新的或升級的認(rèn)證技術(shù)而不需要修改其代碼.因此,JAAS提供了一種可以實(shí)現(xiàn)將各種認(rèn)證機(jī)制通過一種通用的、可配置的方式集成在一起的框架,使得Web應(yīng)用系統(tǒng)的登錄與授權(quán)模塊更加具有靈活性和可擴(kuò)展性.

    JAAS包括兩方面的內(nèi)容:一是認(rèn)證(Authentication), 提供可靠而安全的機(jī)制,是系統(tǒng)通過主體提交的身份信息對主體進(jìn)行身份鑒別的過程.典型的過程就是提交用戶名和密碼來進(jìn)行認(rèn)證,保證合法的用戶才能執(zhí)行應(yīng)用程序;二是授權(quán)(Authorization) ,通過聲明性授權(quán)或編程授權(quán)的方式將訪問資源的權(quán)限授予已認(rèn)證的用戶,用戶只允許訪問其授權(quán)范圍內(nèi)的資源.

    1.2 基于JAAS安全機(jī)制的用戶身份認(rèn)證技術(shù)

    用戶在訪問J2EE應(yīng)用程序時(shí),首先必須通過LoginContext 對象進(jìn)行身份驗(yàn)證,LoginContext對象調(diào)用LoginModules,由LoginModules執(zhí)行具體的登錄認(rèn)證.JAAS整體框架如圖1所示,其中的“Security and Authentication Services”為LoginModules 提供底層認(rèn)證服務(wù),開發(fā)人員也可以通過實(shí)現(xiàn)LoginModule 接口,編寫自己的驗(yàn)證機(jī)制.

    圖1 JAAS總體框架

    J2EE Web應(yīng)用程序只與LoginContext打交道,不需要與底層的安全機(jī)制直接交互.在LoginContext之下是一組可以動態(tài)配置的LoginMudules對象,LoginMudule負(fù)責(zé)使用正確的安全機(jī)制進(jìn)行驗(yàn)證.利用在登錄配置文件中進(jìn)行動態(tài)指定要使用的哪個(gè)LoginModule登錄模塊,采取相應(yīng)的安全機(jī)制進(jìn)行認(rèn)證.驗(yàn)證機(jī)制LoginModules 是可以堆疊的,一次驗(yàn)證過程可以選擇多個(gè)驗(yàn)證機(jī)制,例如在用戶認(rèn)證過程中既實(shí)現(xiàn)口令認(rèn)證又進(jìn)行客戶端數(shù)字證書的雙重堆疊安全認(rèn)證.驗(yàn)證機(jī)制的增加或者修改不影響應(yīng)用程序的使用,體現(xiàn)了JAAS認(rèn)證機(jī)制的可插入性.

    1.3 JAAS用戶認(rèn)證相關(guān)的類

    與JAAS安全機(jī)制中用戶認(rèn)證過程相關(guān)的類主要有:

    (1)Subject類:以javax.security.auth.Subject類表示,用于代表請求的來源,可以是任何驗(yàn)證的實(shí)體,例如是用戶或服務(wù).

    (2)LoginContext類:稱為登錄上下文,應(yīng)用程序主要使用LoginContext來驗(yàn)證和授權(quán)Subject對象.當(dāng)創(chuàng)建一個(gè)LoginContext的實(shí)例時(shí),需要指定一個(gè)配置.LoginContext通常從JAAS登錄配置文件中加載配置信息,這些配置信息告訴LoginContext對象在登錄時(shí)所使用的哪個(gè)或哪些LoginModule對象.

    (3)LoginModule類:LoginContext對象實(shí)際調(diào)用的認(rèn)證模塊類.LoginModule的實(shí)現(xiàn)類可以支持圖1中的常見認(rèn)證方式.用戶也可以通過實(shí)現(xiàn)LoginModule接口進(jìn)行自定義LoginModule登錄模塊.

    (4)CallbackHandler接口和Callback接口:應(yīng)用程序?qū)崿F(xiàn)CallbackHandler接口,并將其傳遞到JAAS框架,通過與應(yīng)用程序交互實(shí)現(xiàn)獲取身份驗(yàn)證數(shù)據(jù)(如用戶名與密碼).CallbackHandler類處理Callback類型的回調(diào)(Callback).常用的回調(diào)方式有:NameCallback用于提示輸入用戶名,PasswordCallback用于提示用戶輸入密碼.LoginModule類可以傳遞一系列的Callback對象給CallbackHandler的handle進(jìn)行處理.

    2 基于JAAS安全機(jī)制的用戶認(rèn)證方案具體設(shè)計(jì)

    利用JAAS技術(shù)實(shí)現(xiàn)用戶認(rèn)證的基本流程是首先要初始化一個(gè)名為LoginContext對象的登錄環(huán)境,其作用是建立用戶與系統(tǒng)之間身份驗(yàn)證的一個(gè)會話,然后再調(diào)用該對象的Login方法執(zhí)行具體的登錄認(rèn)證過程,最后只有當(dāng)用戶身份被驗(yàn)證合法之后才能訪問系統(tǒng)資源.

    2.1 JAAS登錄配置文件與LoginContext登錄上下文對象

    在使用JAAS安全機(jī)制實(shí)現(xiàn)用戶身份認(rèn)證過程中,需要先創(chuàng)建一個(gè)登錄配置文件以指明系統(tǒng)登錄時(shí)所使用的認(rèn)證模塊.JAAS登錄配置文件可以由一個(gè)或多個(gè)項(xiàng)組成,每個(gè)項(xiàng)為某個(gè)特定的應(yīng)用指定底層所使用的認(rèn)證模塊.在本系統(tǒng)中創(chuàng)建了名為jaas.conf 的登錄配置文件,其中包含一個(gè)名為JAASExample的項(xiàng),該項(xiàng)對應(yīng)UserModule和CertModule兩個(gè)自定義認(rèn)證模塊作為用戶登錄時(shí)所使用的底層認(rèn)證模塊.該文件包含內(nèi)容如下:

    JAASExample{

    auth.UserModule required debug=true;

    auth.CertModule required debug=true;

    }

    接下來系統(tǒng)首先實(shí)例化一個(gè)登錄上下文LoginContext對象lc,并分別傳入兩個(gè)參數(shù),構(gòu)造方法的第一個(gè)參數(shù)為 “JAASExample”,即為配置文件jaas.conf中的一個(gè)項(xiàng)的名字,LoginContext將自動讀取并加載登錄配置文件中該項(xiàng)名稱對應(yīng)的登錄模塊;然后通過創(chuàng)建一個(gè)UsrPwdServletCallbackHandler實(shí)例對象作為LoginContext初始化時(shí)的第二個(gè)參數(shù),該類用于獲取認(rèn)證用戶的用戶名和密碼.LoginContext初始化一個(gè)新的、空的javax.security.auth.Subject對象,通過使用該Subject對象和UsrPwdServletCallbackHandler對象初始化UserModule認(rèn)證模塊.LoginContext對象的Login方法調(diào)用登錄認(rèn)證模塊中的Login方法執(zhí)行登錄認(rèn)證,此時(shí)LoginContext將UsrPwdServletCallbackHandler實(shí)例對象轉(zhuǎn)交給參數(shù)“JAASExample”指定的底層認(rèn)證模塊UserModule.當(dāng)?shù)卿浾J(rèn)證模塊需要與用戶交互獲取用戶名和密碼時(shí),該認(rèn)證模塊是不直接與用戶打交道的,而是調(diào)用從LoginContext對象中傳遞過來的UsrPwdServletCallbackHandler對象來執(zhí)行與用戶的交互,通過使用一個(gè)或多個(gè)Callback對象來執(zhí)行與用戶的交互,以獲取用戶名和密碼的認(rèn)證信息,并將之傳遞給底層認(rèn)證模塊實(shí)現(xiàn)登錄用戶的身份認(rèn)證.

    以下代碼首先實(shí)例化一個(gè)LoginContext對象lc, lc在jaas.conf文件中查找名字為“JAASExample”的項(xiàng),找到該項(xiàng)指定要求的底層認(rèn)證技術(shù)模塊,即分別調(diào)用UserModule和CertModule兩個(gè)模塊實(shí)現(xiàn)具體認(rèn)證.當(dāng)需要改變認(rèn)證模塊時(shí),只需修改該項(xiàng)中指定的模塊即可.LoginContext構(gòu)造方法的第二個(gè)參數(shù)為新建的UsrPwdServletCallbackHandler對象,其中username和password為通過request.getParameter()方法獲取從表單輸入的用戶名和密碼,接下來調(diào)用LoginContext對象lc的login方法執(zhí)行認(rèn)證.

    LoginContext lc = new LoginContext(“JAASExample”,new

    UsrPwdServletCallbackHandler(username, password) );

    lc.login().

    2.2 自定義回調(diào)處理器

    自定義的用戶交互類UsrPwdServletCallbackHandler實(shí)現(xiàn)了CallbackHandler接口,該類用于獲取認(rèn)證信息(例如:用戶名和密碼), LoginContext將該CallbackHandler實(shí)例對象傳遞給底層的UserModule登錄認(rèn)證模塊.在UsrPwdServletCallbackHandler()構(gòu)造方法中傳入獲取的用戶名和密碼,首先將用戶名和密碼保存在對象的屬性中,然后提取注冊到其中的所有Callback實(shí)例,將用戶名和密碼傳遞給相應(yīng)的Callback實(shí)例,該用戶交互類主要實(shí)現(xiàn)如下:

    public class UsrPwdServletCallbackHandler implements CallbackHandler {

    String paramName;

    String paramPasswd;

    public UsrPwdServletCallbackHandler(String paramName, String paramPasswd) {

    if (paramName == null || paramPasswd == null)

    throw new NullPointerException();

    this.paramName = paramName; //通過構(gòu)造函數(shù)傳入表單中輸入的用戶名與密碼

    this.paramPasswd = paramPasswd;

    }

    public void handle(Callback[] callbacks) throws IOException,

    UnsupportedCallbackException {

    for (int i = 0; i < callbacks.length; i++) {

    if (callbacks、[i] instanceof NameCallback)

    {

    // 獲取用戶名,將用戶名保存在NameCallback實(shí)例對象nc中

    NameCallback nc = (NameCallback)callbacks[i];

    nc.setName(paramName);

    } else if (callbacks[i] instanceof PasswordCallback) {

    //獲取密碼,將密碼保存在PasswordCallback實(shí)例對象pc中

    PasswordCallback pc = (PasswordCallback)callbacks[i];

    pc.setPassword(paramPasswd.toCharArray());

    }

    }

    以上的handle方法通過遍歷Callback數(shù)組中的各個(gè)元素,提取注冊到CallbackHandler中的所有Callback實(shí)例,將用戶名和密碼傳遞給相應(yīng)的NameCallback實(shí)例和PasswordCallback實(shí)例.

    2.3 自定義登錄認(rèn)證模塊

    當(dāng)系統(tǒng)在執(zhí)行LoginContext對象的login( )方法登錄時(shí),將依次自動調(diào)用登錄配置文件中設(shè)置的各個(gè)指定登錄模塊的login( )方法來實(shí)現(xiàn)登錄驗(yàn)證.本例中分別使用基于用戶口令的登錄認(rèn)證模塊UserModule和基于用戶證書的認(rèn)證模塊CertModule共同實(shí)現(xiàn)用戶的身份認(rèn)證,只有全部通過兩種認(rèn)證模塊的驗(yàn)證才能實(shí)現(xiàn)成功登錄.

    2.3.1 自定義用戶信息登錄模塊UserModule

    用戶個(gè)人信息登錄模塊UserModule是通過獲取用戶名和密碼實(shí)現(xiàn)認(rèn)證.該認(rèn)證模塊給回調(diào)處理器的handle()方法傳遞一個(gè)適當(dāng)?shù)腃allback類型的callbacks字節(jié)數(shù)組,callbacks含有用于獲取用戶名的NameCallback類型對象和用于獲取密碼的PasswordCallback類型對象,然后CallbackHandler執(zhí)行所請求的用戶交互,并將適當(dāng)?shù)闹荡嫒隿allbacks數(shù)組,登錄認(rèn)證模塊通過從callbacks數(shù)組中獲取用戶名與密碼.最后由自定義的UserProxy類訪問MySQL數(shù)據(jù)庫中的用戶信息表,通過調(diào)用validateUser()方法以驗(yàn)證輸入的用戶登錄信息是否與數(shù)據(jù)庫用戶表中某一用戶信息相匹配.UserModule類實(shí)現(xiàn)LoginModule接口,其login( )方法主要實(shí)現(xiàn)代碼為:

    public boolean login( ) throws LoginException {

    //創(chuàng)建充當(dāng)?shù)卿浤K與回調(diào)處理器之間橋梁的Callback對象

    Callback[] callbacks = new Callback[2];

    callbacks[0]= new NameCallback(“User name:”);

    callbacks[1] = new PasswordCallback(“Password: ”, false);

    callbackHandler.handle(callbacks); //執(zhí)行回調(diào)處理器handle方法并傳入callbacks數(shù)組

    loginName = ((NameCallback)callbacks[0]).getName();

    tmpPasswd = ((PasswordCallback)callbacks[1]).getPassword();

    if(tmpPasswd == null) { tmpPasswd[0] = '

    仙桃市| 广灵县| 左贡县| 通州市| 安阳县| 军事| 航空| 焦作市| 敖汉旗| 万载县| 静安区| 德安县| 隆化县| 汝州市| 衡阳市| 弥勒县| 沈阳市| 仁怀市| 垦利县| 寿宁县| 集贤县| 赤壁市| 仙游县| 汉寿县| 玉环县| 扶风县| 泸定县| 沭阳县| 商都县| 工布江达县| 尚义县| 封丘县| 丰原市| 陇南市| 扶风县| 昌乐县| 赤水市| 红河县| 鄂尔多斯市| 界首市| 阿勒泰市|