單點登錄介紹和服務端實現
為什麼要介紹單點登錄?前幾天打開公眾號消息,發現有夥伴在搜索單點登錄關鍵字,於是想寫些相關內容的文章,來擴展下夥伴的的視野或者給出可能行的技術選型方案。這裡給大家介紹到的耶魯大學的一個開源的企業級單點登錄系統,幾年前用在當時公司的一個解決方案,沒想到直到還一直有團隊在維護並且越來越完善,連流行的springBoot、SpringCloud都集成進去了,當然,這只是一個架子,你需要熟讀它的文檔和代碼,才能改造成項目所需要的,所以,也有了這個帖子。
單點登錄是企業業務整合比較流行解決方案,像多個系統使用同一個用戶資料庫的,並且這些系統需要相互信任時,此時使用單點登陸(SSO)是比較合適的。
cas簡介
CAS 是Yale(耶魯)大學的一個開源的企業級單點登錄系統,它的特點:
Java (Spring Webflow/Spring Boot) 服務組件
可插拔身份驗證支持(LDAP,Database,X.509,MFA)
支持多種協議(CAS,SAML,OAuth,OpenID,OIDC)
跨平台客戶端支持(Java,.Net,PHP,Perl,Apache等)
與uPortal,Liferay,BlueSocket,Moodle,Google Apps等集成
cas server: https://github.com/Jasig/cas/releases
cas client: http://developer.jasig.org/cas-clients/
CAS官網地址:http://www.jasig.org/cas
cas服務端需要單獨部署,本篇主要為服務端教程,主要圍繞環境、本地構建、改造以及運行和調試,Cas項目一直有團隊在維護,新的版本都已經集成了springboot和cloud,減少儘可能的xml配置以及可配合pringCloud集成高可用
cas原理和流程
(截圖來源網路)
1.用戶通過browser請求cas client A端的資源。
2.client A端發現用戶未登錄(client沒有收到ST),redirect到cas server,並且把用戶請求服務的url發送給server;server發現用戶瀏覽器中沒有TGC(Ticket Granting Cookie),就跳轉到登錄頁面。
3.用戶在登錄頁面登錄並登錄成功。
4.server在用戶的瀏覽器中設置一個TGC(Ticket Granting Cookie),並且在server端保存一個TGT(Ticket Granting Tciket),然後把用戶重定向到,其中ST是由TGT生成的。
5.client A端通過GET的方法收到ST,向server端驗證這個ticket的有效性,這一步主要是為了防止惡意用來訪問client A,所以雖然ST是server發送給client A的,client A仍然需要向server驗證其有效性。
6.ticket有效,server端返回ticket對應的用戶的用戶名,client A端為用戶提供請求的服務。
上述是未登錄的用戶訪問client A的過程,用戶通過以上步驟已經登錄了CAS系統,此時他訪問CAS系統中信任的client B端,是不用登錄的,實現步驟如下:
1.1.用戶通過browser請求cas client B端的資源。
2.client B端發現沒有收到ST,redirect到cas server,並且把用戶請求服務的url發送給server;server發現用戶瀏覽器中有TGC(Ticket Granting Cookie),驗證該TGC後,用server端存儲的TGT生成一個ST。
3.server把用戶重定向到。
4.client B端通過GET的方法收到ST,向server端驗證這個ticket的有效性.
5.ticket有效,server端返回ticket對應的用戶的用戶名,client B端為用戶提供請求的服務,這樣用戶就不用再次登錄就可以訪問到client B了。
所以從上述過程中,可以看到client端既不能接觸到用戶的用戶名密碼,也不能接觸到用戶的憑證TGT或者TGC,它只做兩件事情:如果用戶的請求里有ST,那麼就向伺服器驗證ST的有效性;如果用戶的請求里沒有ST,那麼就把用戶重定向到cas server;
cas server全權負責管理用戶的用戶名和密碼,如果發現用戶的瀏覽器裡面有有效的TGC,就生成ST把用戶重定向到client端;如果用戶瀏覽器裡面沒有TGC或者TGC無效,就讓用戶重新登錄,然後在用戶的瀏覽器裡面設置新的TGC。而server和用戶瀏覽器之間的交互是https安全協議,這樣就保證了用戶的用戶名密碼的安全性。
環境相關
Jdk 1.8
Maven 3.3
IntelliJ IDEA
Apache-tomcat-8.5.32
下載代碼
下載的是maven版本的
下載完成以後查看目錄結構,發現並無java代碼,而是一些配置文件和腳本文件,所以我們需要對其進行構建和打包
導入項目到idea
如圖,導入完以後,開始下載war包了。網速快的話很快就下好了。然後在插件中執行install 命令 或在目錄中執行maven命令,生成war包
項目初運行
添加tomcat伺服器運行項目,如圖
然後開始運行項目就跑起來了。登錄界面長這樣,
頁面訪問是很慢的,因為在線引入了很多外部網站的css、js等文件。我們後面改造成引入本地的,將極大提升效率
登錄成功界面
項目改造
改造的話按照一般基本要求打算以以下幾點進行開展,基本滿足大部分要求:
項目結構調整(便於二次開發)
登錄驗證 (資料庫登錄、密碼加密方式)
自定義頁面 (個性化定製)
遠程資源本地化 (滿足內網訪問、提升訪問速度)
票據持久化(分散式、高可用)
分散式集群
項目結構調整
默認的項目結構是這樣的
基本是為了構建打包服務和運行。下載到本地構建後查看target目錄,它的結構是這樣的
當然,這些東西都是項目的依賴產生的。所以為了方便二次開發,我們項目結構改造後成這樣
是不是跟spring boot 結構差不多呢?這個結構是根據它的target決定的,我們構建打包的時候能夠去覆蓋它原始的,當然,pom.xml需要這麼配。
在build節點加入這段
除了這點,還整理了pom.xml,去除很多不需要的配置,加入需要的配置。具體見整理後的源碼。
git地址:https://github.com/pengziliu/cas-server.git
或者公眾號回復:單點登錄
後續會就相關點進行改造,歡迎關注。
改造相關
項目結構調整(便於二次開發)
登錄驗證 (資料庫登錄、密碼加密方式)
自定義頁面 (個性化定製)
遠程資源本地化 (滿足內網訪問、提升訪問速度)
票據持久化(分散式、高可用)
分散式集群
客戶端集成
TAG:JAVA葵花寶典 |