陳海虹
(浙江海洋學(xué)院網(wǎng)絡(luò)中心,浙江舟山 316004)
如今不論是高校還是企事業(yè)單位,WEB應(yīng)用系統(tǒng)日漸增多,每個應(yīng)用系統(tǒng)都有自己的用戶管理機(jī)制和身份認(rèn)證機(jī)制。用戶需要記住多個甚至十幾個系統(tǒng)的賬號和密碼,登錄許多應(yīng)用系統(tǒng)才能完成他們的日常工作。所以,需要在多個WEB應(yīng)用系統(tǒng)中實施單點登錄方案,用戶只需要登錄1次就可以訪問所有相互信任的應(yīng)用系統(tǒng),并且在系統(tǒng)之間切換時,將不再受到訪問限制。目前實現(xiàn)單點登錄的技術(shù)主要有2種:一種是采用1個具有單點登錄功能的協(xié)議來完成;一種是利用業(yè)界常用的“偽登錄”技術(shù)。采用具有單點登錄功能的協(xié)議來完成的一個典型代表就是使用Kerberos協(xié)議,Kerberos協(xié)議提供了采用票據(jù)來訪問目標(biāo)系統(tǒng),這也是目前采用的一種比較流行的單點登錄技術(shù),它具有更安全、更具彈性、更高效率的優(yōu)點[1]。但是也有一定的不足,它需要對目標(biāo)系統(tǒng)或目標(biāo)服務(wù)進(jìn)行協(xié)議化,同時需要對應(yīng)用系統(tǒng)做出適當(dāng)?shù)母脑欤@就限制了它對一些不愿開放的應(yīng)用系統(tǒng)的應(yīng)用。因為一些應(yīng)用系統(tǒng)的結(jié)構(gòu)和接口不開放,造成了第三方無法與其對接,另外,還有一些企業(yè)也不愿意對系統(tǒng)進(jìn)行修改?!皞蔚卿洝奔夹g(shù),就是通過一些腳本自動為用戶輸入賬號和密碼,屏蔽用戶登錄目標(biāo)系統(tǒng),這種技術(shù)體現(xiàn)了與應(yīng)用系統(tǒng)的無關(guān)性,例如與應(yīng)用系統(tǒng)的平臺、開發(fā)環(huán)境、結(jié)構(gòu)、編程語言以及腳本,所以應(yīng)用系統(tǒng)無需做任何修改。基于PHP的WEB應(yīng)用系統(tǒng)單點登錄就是根據(jù)“偽登錄”技術(shù)原理,通過PHP語言并結(jié)合MySQL數(shù)據(jù)庫來實現(xiàn)單點登錄功能。
PHP語言是一種廣泛用于Web開發(fā)并可以嵌入HTML的多用途的腳本語言。PHP能運行在包括Windows、Linux等在內(nèi)的絕大多數(shù)操作系統(tǒng)環(huán)境中,并支持Oracle、Sybase、MySQL、ODBC等在內(nèi)的大多數(shù)常見數(shù)據(jù)庫,具有很好的跨平臺性;PHP是開源軟件,代碼在許多工程師手中進(jìn)行了檢測,同時它與Apache編譯在一起的方式也可以讓它具有靈活的安全設(shè)定,具有了公認(rèn)的安全性能;PHP還具有占用系統(tǒng)資源少、代碼執(zhí)行速度快等優(yōu)勢。
MySQL是個真正的多用戶、多線程SQL數(shù)據(jù)庫。它是完全免費的,它的平臺無關(guān)性使其能在多個操作系統(tǒng)上運行,其中包括UNIX、Linux、Solaris、SunOS、FreeBSD等,它還具有文件體積小、支持多線程、優(yōu)化SQL查詢算法、執(zhí)行速度快等優(yōu)勢。目前MySQL被廣泛地應(yīng)用在Internet上的中小型網(wǎng)站和各種中小型數(shù)據(jù)庫管理工作,如財務(wù)、行政、金融、經(jīng)濟(jì)、統(tǒng)計和審計等領(lǐng)域。
目前大部分WEB應(yīng)用系統(tǒng)的身份認(rèn)證技術(shù)在應(yīng)用層上是基于HTTP協(xié)議,HTTP協(xié)議采用了請求/響應(yīng)模型。通常,由HTTP客戶端發(fā)起一個請求,建立一個到服務(wù)器指定端口的TCP連接。HTTP服務(wù)器則在那個端口監(jiān)聽客戶端發(fā)送過來的請求,一旦收到請求,服務(wù)器向客戶端發(fā)回一個狀態(tài)行,比如“HTTP/1.1 200 OK”,和響應(yīng)的消息。HTTP請求報文格式為:請求行-通用信息頭-請求頭-實體頭-報文主體;響應(yīng)報文格式為:狀態(tài)行-通用信息頭-響應(yīng)頭-實體頭-報文主體。
基于HTTP協(xié)議的客戶端訪問服務(wù)器包括4個過程,分別是建立TCP套接字連接、發(fā)送HTTP請求報文、接收HTTP應(yīng)答報文和關(guān)閉TCP套接字連接。HTTP協(xié)議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。這里介紹最常用的GET方法和POST方法。當(dāng)客戶端要從服務(wù)器中讀取文檔時,使用GET方法。GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報文的數(shù)據(jù)部分,回送給客戶端。使用GET方法時,請求參數(shù)和對應(yīng)的值附加在URL后面,利用一個問號代表URL的結(jié)尾與請求參數(shù)的開始,傳遞參數(shù)長度受限制。當(dāng)客戶端給服務(wù)器提供信息較多時可以使用POST方法。POST方法將請求參數(shù)封裝在HTTP請求數(shù)據(jù)中,以名稱/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù)。
每個WEB應(yīng)用系統(tǒng)幾乎都需要數(shù)據(jù)庫來存儲用戶的身份認(rèn)證信息和其他的數(shù)據(jù)信息,但是彼此數(shù)據(jù)庫的類型、庫表結(jié)構(gòu)、字段值、加密方式都不同,無法直接在各應(yīng)用系統(tǒng)的數(shù)據(jù)庫中讀出和操作用戶身份認(rèn)證信息。所以,需要一個獨立的數(shù)據(jù)庫來單獨存儲用戶在各應(yīng)用系統(tǒng)的身份認(rèn)證信息。
本系統(tǒng)采用MySQL數(shù)據(jù)庫。數(shù)據(jù)結(jié)構(gòu)主要包含3張表,分別是:sso_app_info、sso_app_props、sso_login_info。
sso_app_info表存放:PHP模擬HTTP客戶端登錄各應(yīng)用系統(tǒng)用到的數(shù)據(jù)信息、允許用戶輸入賬號密碼的表單元素名、用戶身份驗證失敗應(yīng)用系統(tǒng)返回的信息。sso_app_props表存放:允許用戶輸入除賬號密碼外其它表單元素名,這張表中的數(shù)據(jù)主要用來構(gòu)建動態(tài)或靜態(tài)表單。sso_login_info表存放:用戶成功登錄各應(yīng)用系統(tǒng)的身份認(rèn)證信息。圖1是這個數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)庫模型圖。
圖1 數(shù)據(jù)庫模型圖Fig.1 Database illustration of model
單點登錄主要與應(yīng)用系統(tǒng)和用戶有關(guān),所以首先分配三個變量標(biāo)識應(yīng)用系統(tǒng)和用戶,它們分別是應(yīng)用系統(tǒng)的ID號、應(yīng)用系統(tǒng)名稱、用戶ID號,它們的值分別與表sso_app_info中的uid、name字段和表sso_login_info中的userid字段相對應(yīng)。單點登錄模型依據(jù)這3個值判斷哪個用戶登錄到哪個應(yīng)用系統(tǒng)。
如果數(shù)據(jù)庫表sso_login_info中有符合這些變量的記錄,則說明用戶曾成功登錄過這個應(yīng)用系統(tǒng),取出庫中數(shù)據(jù),以URL形式或動態(tài)表單形式傳遞登錄數(shù)據(jù)并自動登錄到WEB應(yīng)用系統(tǒng)。
如果沒有記錄,說明用戶首次登錄這個應(yīng)用系統(tǒng),由單點登錄系統(tǒng)生成或直接調(diào)用靜態(tài)表單頁面,讓用戶初次完成應(yīng)用系統(tǒng)認(rèn)證信息的輸入過程。并用PHP模擬瀏覽器客戶端傳遞用戶輸入的認(rèn)證信息,通過這個方法檢查用戶輸入的認(rèn)證信息是否能通過WEB應(yīng)用系統(tǒng)服務(wù)器的認(rèn)證。
如果用戶輸入的認(rèn)證信息能通過WEB應(yīng)用系統(tǒng)服務(wù)器的認(rèn)證則將認(rèn)證信息存入庫中,并借助URL形式或者動態(tài)表單形式傳遞認(rèn)證信息并自動登錄應(yīng)用系統(tǒng),否則輸出錯誤信息。程序流程圖如圖2所示。
圖2 總體設(shè)計程序流程圖Fig.2 The flowchart of system design
用戶輸入賬號、密碼等登錄信息后,應(yīng)用系統(tǒng)服務(wù)器需要判斷是否通過此認(rèn)證??捎肞HP模擬HTTP客戶端,發(fā)送認(rèn)證信息及接收反饋信息,從反饋信息中判斷認(rèn)證是否被通過。PHP模擬HTTP客戶端的程序流程圖如圖3所示。fsockopen函數(shù)可以打開指定網(wǎng)域的TCP套接字連接或IP地址的TCP套接字連接,然后傳回1個文件指標(biāo),這可以和fwrite等函數(shù)一起使用。相關(guān)代碼[3]如下:
圖3 PHP模擬瀏覽器登入流程圖Fig.3 The flowchart about using php to mimic browser logining
表單是一個包含表單元素的區(qū)域,表單元素是允許用戶在表單中(比如文本域、下拉列表、單選框、復(fù)選框等等)輸入信息的元素。
為了獲取不同應(yīng)用系統(tǒng)中不同用戶的登錄信息,需要預(yù)先生成供用戶填寫的模擬應(yīng)用系統(tǒng)登錄界面的表單。不同的應(yīng)用系統(tǒng)具有不同的表單元素,可以先分析各應(yīng)用系統(tǒng)的表單元素并存入數(shù)據(jù)庫中,然后利用PHP語言加載數(shù)據(jù)庫中的數(shù)據(jù)生成具有表單元素的登錄頁面,為了提高速度,再將動態(tài)頁面生成靜態(tài)頁面。相關(guān)代碼如下:
代替用戶輸入認(rèn)證信息自動登入WEB應(yīng)用系統(tǒng)的步驟中也用到了表單。
為了達(dá)到程序的強(qiáng)健性,將HTTP協(xié)議中的GET和POST方法相結(jié)合來提交請求認(rèn)證信息,因為有的系統(tǒng)不支持跨域POST方法。GET方法將認(rèn)證請求信息放在URL中傳遞給系統(tǒng)服務(wù)器,POST方法是將認(rèn)證請求信息作為表單元素提交給系統(tǒng)服務(wù)器。相關(guān)代碼如下:
依據(jù)“偽登錄”技術(shù)原理采用PHP腳本語言自動為用戶輸入賬號和密碼,模擬用戶登錄應(yīng)用系統(tǒng)的單點登錄模型,使用戶只須完成最初的登錄過程就可以直接訪問應(yīng)用系統(tǒng),無須每次訪問一個應(yīng)用資源都登錄1次,大大提高了工作效率。這個模型與應(yīng)用系統(tǒng)無關(guān),應(yīng)用系統(tǒng)無須修改就可使用,具有高度擴(kuò)展性,同時,即使單點登錄系統(tǒng)失效,應(yīng)用系統(tǒng)仍可以正常使用,容錯性好。需要改進(jìn)的地方是,它沒有將存儲認(rèn)證信息的數(shù)據(jù)庫與其他應(yīng)用系統(tǒng)的數(shù)據(jù)庫同步起來。
[1]朱 嬋.基于Kerberos票據(jù)的Web單點登錄設(shè)計[J].現(xiàn)代計算機(jī),2007(2):76-77.
[2]STEVENS W R.TCP/IP詳解·卷3:TCP事務(wù)協(xié)議、HTTP、NNTP和UNIX域協(xié)議[M].北京:機(jī)械工業(yè)出版社,2002.
[3]WILLISON.httpClient-a PHP Web Client Class[CP/OL].[2003-04-06].http://scripts.incutio.com/httpclient/index.php.