CAS 單點登錄Web工作流程
如圖流程清晰,可以去官網了解https://github.com/apereo。
下面看前后端分離的架構:
假設公司有多個系統希望能統一登錄認證一次都可以訪問,如訂單管理系統(oms),商品管理系統(pms),客戶管理系統(crm),例如:用戶訪問 oms 系統攔截請求發現沒有登錄,就跳轉到cas server 去登錄,登錄完成后簽發一個ST,重定向到oms系統,oms拿着回傳的參數ST去CAS驗證,驗證通過后,允許用戶訪問資源,如果是前后端分離的應用,系統就由原來的單個應用,分為前后端分開部署(動靜分離),前端的靜態服務(html,css.js),后端的(api接口),這時候用戶端瀏覽器先訪問前端加載靜態資源,然后再向后端api發起請求,后端api 接口通過過濾器鑒權。如果cas server 登錄后跳轉到后端服務地址肯定是不行的,這時候可以在服務端i在完成驗證后繼續跳轉到前端地址,index.jsp:
<%@ page import="com.ctrip.framework.apollo.ConfigService" %> <%@ page import="com.ctrip.framework.apollo.Config" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <% //不同環境前端地址不同(開發,生產)所以通過配置獲取 Config omsConfig = ConfigService.getConfig("oms"); response.sendRedirect(omsConfig.getProperty("web.front.url","")); %> </body> </html>
這樣通過繼續跳轉最終到前端頁面。
需要注意的地方:
1、前后端分離后需要注意跨域的問題所以要在后端服務響應頭設置如下內容:
httpServletResponse.addHeader("Access-Control-Allow-Origin", acaOrigin);//前端域名(不同環境不同可以通過配置讀取) httpServletResponse.addHeader("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS"); httpServletResponse.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, *"); httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
2、前端訪問后端api 地址也要是可以配置的,配置有兩種方式,一種在程序構建時注入,一種在程序運行時產生。高性能 Javascript》中有一節提及,“開發高性能應用的一個普遍規則是,只要是能在構建時完成的工作,就不要留到運行時去做”所以前端在編譯的時候也需要根據不同環境變量,設置不同的后端地址。