楊世旺 劉波
(廣西廣播電視技術中心)
JEECMSv9.3平臺是江西金磊科技發(fā)展有限公司旗下的產(chǎn)品,它是一款集PC互聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)和微信網(wǎng)站于一體的網(wǎng)站群管理系統(tǒng),新門戶網(wǎng)站基于此平臺進行開發(fā)。
單位內部業(yè)務系統(tǒng)眾多,門戶網(wǎng)站作為單位對外開放展示的窗口,將各個業(yè)務系統(tǒng)入口整合到門戶網(wǎng)站中非常有必要,可解決了各業(yè)務系統(tǒng)重復登錄的問題。在進行業(yè)務系統(tǒng)單點登錄整合過程中,發(fā)現(xiàn)即使JEECMSv9.3框架提供了統(tǒng)一的單點登錄接口,但由于單位各業(yè)務系統(tǒng)均已不在維護期,且系統(tǒng)接口不統(tǒng)一或未提供單點登錄驗證接口,所以只能通過技術手段對平臺代碼進行二次開發(fā),實現(xiàn)各業(yè)務系統(tǒng)單點登錄整合功能。
由于整合過程是單向整合,各業(yè)務系統(tǒng)無法針對單點登錄進行接口調整,所以產(chǎn)生不少技術問題。
通過分析JEECMSv9.3平臺代碼得知,該平臺核心框架為FreeMarker+hibernate+Spirng的mvc分層架構,平臺后臺采用了Maven開發(fā)技術,網(wǎng)站管理后臺采用VUE技術,網(wǎng)站前臺采用html腳本結合jquery等技術實現(xiàn)。門戶網(wǎng)站要實現(xiàn)單點登錄功能,需改動網(wǎng)站前臺代碼和平臺后臺代碼。由于平臺的高度可配置性,網(wǎng)站前臺代碼和后臺代碼的交互非常靈活,前臺的所有鏈接都需要和后臺進行交互,因此對網(wǎng)站代碼的熟悉程度對于單點登錄功能的開發(fā)非常關鍵。
系統(tǒng)后臺采用eclipse集成管理工具作為java代碼編譯環(huán)境,前臺網(wǎng)站代碼由于都是通過平臺動態(tài)生成的,不適合采用任何開發(fā)工具去編譯開發(fā),所以只能采用文本編輯的方式去調整。此外,網(wǎng)站前臺采用html靜態(tài)腳本進行展示,而網(wǎng)站后臺采用java進行相應基本邏輯處理,因此選擇通過jquery技術實現(xiàn)前后臺的同步、異步交互,來協(xié)助實現(xiàn)單點登錄功能的集成。
集成單點登錄的目的是實現(xiàn)各業(yè)務系統(tǒng)的免登錄進入,其基本設計邏輯為:
點擊單點登錄入口,先檢測門戶網(wǎng)站是否已登錄,如未登錄,則進行提示并跳轉到門戶登錄頁面;
如果門戶網(wǎng)站已登錄,下一步則是判斷該業(yè)務系統(tǒng)是否已進行綁定,如未綁定,則自動跳轉到綁定頁面;
如果業(yè)務系統(tǒng)已綁定,則在記錄此次登錄的相關信息后,直接跳轉進入業(yè)務系統(tǒng)。
基本設計邏輯流程展示如圖1。
圖1 基本設計流程
記錄業(yè)務系統(tǒng)的綁定、登錄等信息時需要和數(shù)據(jù)庫進行交互,保存業(yè)務系統(tǒng)的名稱、用戶名、密碼、綁定時間、登錄時間、登錄次數(shù)等,詳細的數(shù)據(jù)表設計如表1。
表1 表結構設計
1.跳轉判斷
當用戶點擊業(yè)務系統(tǒng)入口時,系統(tǒng)需要將該業(yè)務系統(tǒng)的服務器網(wǎng)址、端口、驗證方法等參數(shù)傳遞到后臺進行驗證,為了方便這些參數(shù)讀取,將參數(shù)以json對象的形式,保存在js配置文件中。
門戶網(wǎng)站業(yè)務系統(tǒng)入口使用html技術中的標簽進行展示,首先將標簽中的href屬性設置成(#)空錨點,使其在單擊時不做跳轉刷新,而在標簽單擊(onclick)方法功能中,添加綁定js中自定義的ITool.sso函數(shù),如:
在綁定的ITool.sso方法中,通過使用jquery的ajax技術,實現(xiàn)與java后臺進行交互,獲取門戶網(wǎng)站登錄、業(yè)務系統(tǒng)綁定信息,并在交互成功后,通過邏輯判斷,設定跳轉鏈接,跳轉到登錄頁面、綁定頁面或直接單點登錄進入業(yè)務系統(tǒng),實現(xiàn)邏輯如圖2。
2.綁定操作
圖2 頁面跳轉判斷
當判斷業(yè)務系統(tǒng)未進行綁定時,系統(tǒng)自動跳轉到綁定頁面,系統(tǒng)綁定頁面借鑒了網(wǎng)站登錄頁面,需要用戶輸入綁定系統(tǒng)的用戶名和密碼,然后點擊綁定按鈕,系統(tǒng)將通過ajax方法和后臺交互,并進行第三方跨域提交驗證。在和第三方系統(tǒng)進行跨域登錄認證時,經(jīng)過多次嘗試,由于第三方業(yè)務系統(tǒng)不一定支持ajax異步認證的方式,所以該認證統(tǒng)一采用后臺認證的方式。
由于不同的業(yè)務系統(tǒng)的跨域認證會返回不同的認證結果,在系統(tǒng)認證設計時,通過動態(tài)js方法,實現(xiàn)不同的業(yè)務系統(tǒng)的認證跳轉。
在進行第三方跨域認證時,使用后臺java的URLConnection類,讀取請求URL,并返回請求結果的頁面內容信息,通過對頁面內容進行解析,判斷認證是否成功,如圖3。
圖3 第三方跨域登錄認證
判定是否綁定成功,如綁定成功,則直接跳轉單點登錄進入業(yè)務系統(tǒng),如失敗,則在頁面上已紅色字體提示錯誤信息。
3.登錄跳轉
在綁定成功或者判定用戶已綁定業(yè)務系統(tǒng)后,需要使用前臺jquery技術,動態(tài)創(chuàng)建所需提交的元素標簽,模擬業(yè)務系統(tǒng)的form表單提交方法,實現(xiàn)邏輯如圖4。
4.綁定管理
在用戶對業(yè)務系統(tǒng)進行綁定后,可能會存在所綁定的業(yè)務系統(tǒng)用戶名或者密碼已修改的情況,針對這種情況,前臺增加了綁定管理功能,實現(xiàn)對業(yè)務系統(tǒng)的解除綁定、重新綁定等功能。
1.代碼邏輯
通過分析平臺后臺代碼,將單點登錄后臺java代碼的實現(xiàn)附加在平臺用戶管理模塊;后臺代碼主要需要實現(xiàn)用戶網(wǎng)站登錄狀態(tài)、綁定狀態(tài)獲取,頁面跳轉參數(shù)獲取及調整等。
圖4 登錄跳轉
用戶網(wǎng)站登錄狀態(tài)、綁定狀態(tài)獲取,首先獲取網(wǎng)站登錄用戶信息,如獲取不到,則返回用戶登錄狀態(tài)為false,如能獲取,則根據(jù)用戶ID和參數(shù)到數(shù)據(jù)庫讀取綁定信息,如已綁定,則進一步返回綁定的用戶名和密碼等相關信息。
在進行第三方跨域用戶綁定認證時,采用后臺java的URLConnection類,實現(xiàn)方法中,除了傳遞請求的httpUrl外,還需傳遞進來編碼方式和超時時間,否則會造成返回結果亂碼或在網(wǎng)絡不通暢時網(wǎng)頁卡頓的現(xiàn)象。
此外,為了保證代碼的嚴謹性、可讀性,在進行后臺java編碼時,需嚴格遵守平臺的后臺編碼規(guī)范,這對系統(tǒng)的后續(xù)升級維護至關重要。
2.數(shù)據(jù)庫操作
單點登錄的綁定信息,最終都會保存到數(shù)據(jù)庫表sso_user中,實現(xiàn)邏輯設計如下:
當?shù)谝淮谓壎〞r,判斷是否已綁定過,如已綁定,則修改綁定狀態(tài),如未綁定,則記錄綁定系統(tǒng)編號、用戶ID、綁定用戶名稱、加密后的綁定用戶密碼,綁定時間等;
用戶進行單點登錄時,記錄用戶的登錄次數(shù),登錄時間等;
進行解除綁定時,修改該綁定的狀態(tài)、最后修改時間。
第一、在進行單點登錄第三方跨域認證時,經(jīng)過多次嘗試,最終選定使用后臺java的URLConnection類來實現(xiàn),因為第三方業(yè)務系統(tǒng)不一定支持ajax異步認證的方式,所以驗證時是直接調用業(yè)務系統(tǒng)的登錄方法來實現(xiàn),所以無法使用前臺ajax請求來獲取認證請求結果;
第二、在進行第三方系統(tǒng)登錄跳轉時,模擬form表單進行提交時,需要注意提交頁面的編碼方式,做到動態(tài)修改成第三方網(wǎng)站所需的編碼方式,在提交后,再將網(wǎng)站編碼方式修改回來,否則會造成原網(wǎng)站亂碼或功能異常;
第三、當遇到實在無法單向去對第三方系統(tǒng)進行判斷驗證或者登錄時,最好的方式還是通過和相關技術人員進行溝通,獲取第三方系統(tǒng)的相關信息,如在和對接集成時,是否要對參數(shù)進行加密操作等,這集成前是無法預知的,所以及時的溝通非常重要。
目前單位的門戶網(wǎng)站OA辦公、監(jiān)控平臺兩個單點登錄接口已經(jīng)完成編碼和測試工作,程序已可正常運行;如后續(xù)需要增加其他第三方接口時,可以有所借鑒或者直接復用已有的接口,減少不必要的重復工作,提高工作效率。