陳海虹
(浙江海洋學院網絡中心,浙江舟山 316004)
如今不論是高校還是企事業單位,WEB應用系統日漸增多,每個應用系統都有自己的用戶管理機制和身份認證機制。用戶需要記住多個甚至十幾個系統的賬號和密碼,登錄許多應用系統才能完成他們的日常工作。所以,需要在多個WEB應用系統中實施單點登錄方案,用戶只需要登錄1次就可以訪問所有相互信任的應用系統,并且在系統之間切換時,將不再受到訪問限制。目前實現單點登錄的技術主要有2種:一種是采用1個具有單點登錄功能的協議來完成;一種是利用業界常用的“偽登錄”技術。采用具有單點登錄功能的協議來完成的一個典型代表就是使用Kerberos協議,Kerberos協議提供了采用票據來訪問目標系統,這也是目前采用的一種比較流行的單點登錄技術,它具有更安全、更具彈性、更高效率的優點[1]。但是也有一定的不足,它需要對目標系統或目標服務進行協議化,同時需要對應用系統做出適當的改造,這就限制了它對一些不愿開放的應用系統的應用。因為一些應用系統的結構和接口不開放,造成了第三方無法與其對接,另外,還有一些企業也不愿意對系統進行修改。“偽登錄”技術,就是通過一些腳本自動為用戶輸入賬號和密碼,屏蔽用戶登錄目標系統,這種技術體現了與應用系統的無關性,例如與應用系統的平臺、開發環境、結構、編程語言以及腳本,所以應用系統無需做任何修改。基于PHP的WEB應用系統單點登錄就是根據“偽登錄”技術原理,通過PHP語言并結合MySQL數據庫來實現單點登錄功能。
PHP語言是一種廣泛用于Web開發并可以嵌入HTML的多用途的腳本語言。PHP能運行在包括Windows、Linux等在內的絕大多數操作系統環境中,并支持Oracle、Sybase、MySQL、ODBC等在內的大多數常見數據庫,具有很好的跨平臺性;PHP是開源軟件,代碼在許多工程師手中進行了檢測,同時它與Apache編譯在一起的方式也可以讓它具有靈活的安全設定,具有了公認的安全性能;PHP還具有占用系統資源少、代碼執行速度快等優勢。
MySQL是個真正的多用戶、多線程SQL數據庫。它是完全免費的,它的平臺無關性使其能在多個操作系統上運行,其中包括UNIX、Linux、Solaris、SunOS、FreeBSD等,它還具有文件體積小、支持多線程、優化SQL查詢算法、執行速度快等優勢。目前MySQL被廣泛地應用在Internet上的中小型網站和各種中小型數據庫管理工作,如財務、行政、金融、經濟、統計和審計等領域。
目前大部分WEB應用系統的身份認證技術在應用層上是基于HTTP協議,HTTP協議采用了請求/響應模型。通常,由HTTP客戶端發起一個請求,建立一個到服務器指定端口的TCP連接。HTTP服務器則在那個端口監聽客戶端發送過來的請求,一旦收到請求,服務器向客戶端發回一個狀態行,比如“HTTP/1.1 200 OK”,和響應的消息。HTTP請求報文格式為:請求行-通用信息頭-請求頭-實體頭-報文主體;響應報文格式為:狀態行-通用信息頭-響應頭-實體頭-報文主體。
基于HTTP協議的客戶端訪問服務器包括4個過程,分別是建立TCP套接字連接、發送HTTP請求報文、接收HTTP應答報文和關閉TCP套接字連接。HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。這里介紹最常用的GET方法和POST方法。當客戶端要從服務器中讀取文檔時,使用GET方法。GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。使用GET方法時,請求參數和對應的值附加在URL后面,利用一個問號代表URL的結尾與請求參數的開始,傳遞參數長度受限制。當客戶端給服務器提供信息較多時可以使用POST方法。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據。
每個WEB應用系統幾乎都需要數據庫來存儲用戶的身份認證信息和其他的數據信息,但是彼此數據庫的類型、庫表結構、字段值、加密方式都不同,無法直接在各應用系統的數據庫中讀出和操作用戶身份認證信息。所以,需要一個獨立的數據庫來單獨存儲用戶在各應用系統的身份認證信息。
本系統采用MySQL數據庫。數據結構主要包含3張表,分別是:sso_app_info、sso_app_props、sso_login_info。
sso_app_info表存放:PHP模擬HTTP客戶端登錄各應用系統用到的數據信息、允許用戶輸入賬號密碼的表單元素名、用戶身份驗證失敗應用系統返回的信息。sso_app_props表存放:允許用戶輸入除賬號密碼外其它表單元素名,這張表中的數據主要用來構建動態或靜態表單。sso_login_info表存放:用戶成功登錄各應用系統的身份認證信息。圖1是這個數據結構的數據庫模型圖。

圖1 數據庫模型圖Fig.1 Database illustration of model
單點登錄主要與應用系統和用戶有關,所以首先分配三個變量標識應用系統和用戶,它們分別是應用系統的ID號、應用系統名稱、用戶ID號,它們的值分別與表sso_app_info中的uid、name字段和表sso_login_info中的userid字段相對應。單點登錄模型依據這3個值判斷哪個用戶登錄到哪個應用系統。
如果數據庫表sso_login_info中有符合這些變量的記錄,則說明用戶曾成功登錄過這個應用系統,取出庫中數據,以URL形式或動態表單形式傳遞登錄數據并自動登錄到WEB應用系統。
如果沒有記錄,說明用戶首次登錄這個應用系統,由單點登錄系統生成或直接調用靜態表單頁面,讓用戶初次完成應用系統認證信息的輸入過程。并用PHP模擬瀏覽器客戶端傳遞用戶輸入的認證信息,通過這個方法檢查用戶輸入的認證信息是否能通過WEB應用系統服務器的認證。
如果用戶輸入的認證信息能通過WEB應用系統服務器的認證則將認證信息存入庫中,并借助URL形式或者動態表單形式傳遞認證信息并自動登錄應用系統,否則輸出錯誤信息。程序流程圖如圖2所示。

圖2 總體設計程序流程圖Fig.2 The flowchart of system design
用戶輸入賬號、密碼等登錄信息后,應用系統服務器需要判斷是否通過此認證。可用PHP模擬HTTP客戶端,發送認證信息及接收反饋信息,從反饋信息中判斷認證是否被通過。PHP模擬HTTP客戶端的程序流程圖如圖3所示。fsockopen函數可以打開指定網域的TCP套接字連接或IP地址的TCP套接字連接,然后傳回1個文件指標,這可以和fwrite等函數一起使用。相關代碼[3]如下:


圖3 PHP模擬瀏覽器登入流程圖Fig.3 The flowchart about using php to mimic browser logining
表單是一個包含表單元素的區域,表單元素是允許用戶在表單中(比如文本域、下拉列表、單選框、復選框等等)輸入信息的元素。
為了獲取不同應用系統中不同用戶的登錄信息,需要預先生成供用戶填寫的模擬應用系統登錄界面的表單。不同的應用系統具有不同的表單元素,可以先分析各應用系統的表單元素并存入數據庫中,然后利用PHP語言加載數據庫中的數據生成具有表單元素的登錄頁面,為了提高速度,再將動態頁面生成靜態頁面。相關代碼如下:


代替用戶輸入認證信息自動登入WEB應用系統的步驟中也用到了表單。
為了達到程序的強健性,將HTTP協議中的GET和POST方法相結合來提交請求認證信息,因為有的系統不支持跨域POST方法。GET方法將認證請求信息放在URL中傳遞給系統服務器,POST方法是將認證請求信息作為表單元素提交給系統服務器。相關代碼如下:

依據“偽登錄”技術原理采用PHP腳本語言自動為用戶輸入賬號和密碼,模擬用戶登錄應用系統的單點登錄模型,使用戶只須完成最初的登錄過程就可以直接訪問應用系統,無須每次訪問一個應用資源都登錄1次,大大提高了工作效率。這個模型與應用系統無關,應用系統無須修改就可使用,具有高度擴展性,同時,即使單點登錄系統失效,應用系統仍可以正常使用,容錯性好。需要改進的地方是,它沒有將存儲認證信息的數據庫與其他應用系統的數據庫同步起來。
[1]朱 嬋.基于Kerberos票據的Web單點登錄設計[J].現代計算機,2007(2):76-77.
[2]STEVENS W R.TCP/IP詳解·卷3:TCP事務協議、HTTP、NNTP和UNIX域協議[M].北京:機械工業出版社,2002.
[3]WILLISON.httpClient-a PHP Web Client Class[CP/OL].[2003-04-06].http://scripts.incutio.com/httpclient/index.php.