三無老舊系統單點登入技術

關於多系統單點登入,這並非陌生概念。然而在企業應用系統的建設過程中,多個應用系統一般是在不同時期開發完成的,各應用系統由於功能側重、設計方案和開發技術有所不同,也就形成了各自獨立的使用者庫和使用者認證體系。這也是在實施單點登入改造時,面臨的最大問題,而其中尤以大量存在的“三無系統”成為單點登入改造實施的最大攔路虎。

三無老舊系統單點登入技術

關於單點登入技術,最近在研究,單點登入包含好幾個方面,接入前後端分離的單點登入系統,這個相對比較簡單些,選擇的鑑權驗證機制也比較多,因為大多數前後端分離的系統是基於token驗證的,不存在跨域問題,但是如果要接入第三方的老系統的話,如果老系統有人在維護,可以改程式碼的話也比較簡單,但是如果是三無老舊系統的話就比較麻煩了。

所謂“三無系統”是指企業中沒有提供單點登入對接介面,沒有原始碼可以修改、過保,沒有廠家支撐的存量系統。企業中的“三無系統”使用這種方式進行單點登入整合,在落地上存在較大的難題,首先是實施成本高,需要調動原廠修改程式,費用高;其次是實施複雜,涉及開發者較多,實施週期長;再之擴充套件性差,跟系統廠家、應用的平臺、環境有關,有些系統不能進行單點登入改造。

那麼對於這些三無系統我們是如何處理的呢?為此我也是進行了大量的驗證,找解決方案,因為我是做後端開發的,首先想到的是從java後端出發,首先肯定的是模擬登入請求,將模擬登陸請求的sessionid傳入到response中,然後通過後端重定向到三無系統登入後的頁面,其中需要注意的是cookie設定domain解決跨域問題,按照這個思路我寫了如下介面程式碼。

@GET@Path(“/formLogin”)@ApiOperation(value = “auth模擬登陸”)public void formLogin(@Context HttpServletRequest request, @Context HttpServletResponse response) { String CookieValue = “”; String loginUrl = “http://zsyz。dev。jpsycn。com/admin/check。do”; String dataUrl = “http://zsyz。dev。jpsycn。com/admin/index。do”; String userName = request。getParameter(“userName”); String password = request。getParameter(“password”); System。out。println(“userName ”+userName+“ password ”+password); HttpClient httpClient = new HttpClient(); httpClient。getParams()。setParameter(HttpMethodParams。HTTP_CONTENT_CHARSET, “utf-8”); PostMethod postMethod = new PostMethod(loginUrl); NameValuePair[] postData = {new NameValuePair(“userName”, userName), new NameValuePair(“passWord”, password)}; postMethod。setRequestBody(postData); try { httpClient。getParams()。setCookiePolicy(CookiePolicy。BROWSER_COMPATIBILITY); int statusCode=httpClient。executeMethod(postMethod); System。out。println(“code===============”+statusCode); httpClient。executeMethod(postMethod); System。out。println(“httpclient的cookie ”+httpClient。getState()。getCookies()); String JSESSIONID = “”; org。apache。commons。httpclient。Cookie[] cookies = httpClient。getState()。getCookies(); for (int i = 0; i < cookies。length; i++) { CookieValue = CookieValue+cookies[i]+“;”; if(i==0){ String sp[] = cookies[i]。toString()。split(“=”); JSESSIONID = sp[1]; } } if(statusCode==200) {//重定向到新的URL CookieValue+=“ Domain=jpsycn。com;”; System。out。println(“模擬登入成功 ”+CookieValue); GetMethod getMethod = new GetMethod(dataUrl); getMethod。setRequestHeader(“Cookie”, CookieValue); postMethod。setRequestHeader(“Host”, “zsyz。dev。jpsycn。com”); postMethod。setRequestHeader(“Referer”, “http://zsyz。dev。jpsycn。com/admin/login。do”); postMethod。setRequestHeader(“User-Agent”, “Mozilla/5。0 (Windows NT 10。0; Win64; x64) AppleWebKit/537。36 (KHTML, like Gecko) Chrome/86。0。4240。111 Safari/537。36”); httpClient。executeMethod(getMethod); String result = getMethod。getResponseBodyAsString(); Cookie cookie = new CookieBuilder() 。setName(“JSESSIONID”) 。setValue(JSESSIONID) 。setDomain(“jpsycn。com”) 。setPath(“/”) 。setExpireSeconds((int)(60)) 。build(); response。addCookie(cookie); System。out。println(“登陸成功的cookie ”+CookieValue+“ header ”+response。getHeader(“Set-Cookie”)); response。sendRedirect(“http://zsyz。dev。jpsycn。com/admin/index。do”); }else{ System。out。println(“登入失敗”); } } catch (Exception e) { e。printStackTrace(); }}

這種思路實現的程式碼雖然能模擬登入成功,但是因為並不是token驗證機制,每次重定向後的頁面cookie中的sessionid都會變化,所以這種方案並不可行。

接下來我們來從前端著手看看能不能實現,前端實現的話也分帶驗證碼不帶,我們之前看了不少公司的產品,他們有個外掛可以獲取到form表單登入的使用者名稱,密碼,帶驗證碼的他們目前還做不到,但是我做到了,一會分享程式碼。

先來看看不帶驗證碼的,以http://zsyz。dev。jpsycn。com/admin/login。do鄭州市招商引資平臺來說。

三無老舊系統單點登入技術

模擬登入了一下獲取登入了一下

三無老舊系統單點登入技術

發現他是form表單登入的,這時我們使用網上說的密碼代填方式,說白了就是表單登入,還不能是ajaxForm這種形式的表單提交,這樣會出現跨域問題,但是這種提交會返回json的驗證資料,我們怎麼接收呢?我是採用了ifream的形式展示在頁面上,當時實際上應該隱藏著的,前端頁面我部署在自己的121。36。107。248伺服器上,如果直接透過ip訪問會出現跨域問題,這時我就會想到配子域名的方式,於是我在host檔案中配置了一下,用一個和這個平臺二級域名相同的域名對映到我的伺服器ip上,實際上這個操作應該nginx來實現,但想到要購買域名,所以就先改host檔案。

三無老舊系統單點登入技術

透過http://zsyz2。dev。jpsycn。com/index。html訪問我自己的前端頁面

三無老舊系統單點登入技術

三無老舊系統單點登入技術

​接下來我們來看看有驗證碼的系統如何模擬登入,我們以http://218。28。223。243:9000/zzjyw/loginController。do?login

三無老舊系統單點登入技術

我們要考慮的問題是驗證碼和介面呼叫是在218的域下,前端頁面部署在121的域下,就是要處理這倆問題才能解決跨域問題,於是我在host檔案下配置了對映。

三無老舊系統單點登入技術

然後驗證碼也是透過aaa的域名訪問,介面也是aaa,前端頁面部署在121用bbb訪問,這就可以解決跨域問題。

三無老舊系統單點登入技術

三無老舊系統單點登入技術

下邊我附上前端的主要程式碼,想要全部程式碼或者有什麼疑問可以關注公眾號“蛋皮皮”進行諮詢。

三無老舊系統單點登入技術

點選事件

var oForm = document。querySelector(‘#formP’); var oBtn = document。querySelector(‘#btn’);oBtn。onclick = function(){alert(“111”);oForm。submit();var int=self。setInterval(function(){ // 這個方法是說在延遲兩秒後執行大括號裡的方法window。location。href=“http://www。aaa。baixing。com:9000/zzjyw/loginController。do?login”;},2000) //這裡2000代表兩秒}

喜歡請關注“蛋皮皮”公眾號