在微服務以及分佈式系統中,單點登陸變得愈來愈廣泛,鬆哥以前也有兩篇文章和你們介紹過單點登陸的方案:php
這兩種方案中,JWT 存在一個註銷登陸的問題,要費點功夫解決。@EnableOAuth2Sso 註解這種方案不存在註銷登陸的問題,可是又不像 JWT 那麼靈活。java
沒有銀彈!git
在實際項目中,咱們只能根據本身的實際需求,看一看哪種方案更適合本身,而後在此基礎上進行改造!github
如今咱們在 Spring Cloud Security 中使用 OAuth2+JWT 或者使用 @EnableOAuth2Sso 註解比之前要方便不少了,鬆哥也是最近才把項目切換到 Spring Cloud Security 技術棧上面來,在這以前,單點登陸用的更多的是 CAS 單點登陸。相信有很多小夥伴在公司裏可能也仍是使用了 CAS 單點登陸這種方案,今天鬆哥就來花點時間,和你們聊聊 CAS+Spring Security 實現單點登陸,這種方案到底該怎麼玩。web
可能會連續幾篇文章來介紹 CAS 單點登陸,本文先來講說理論和登陸流程。另外,因爲 CAS 和 Spring Cloud OAuth2 在某些方面具備必定的類似性,因此強烈建議你們先看一看鬆哥的 OAuth2 系列教程,再來閱讀本文就會輕鬆不少(公衆號後臺回覆 OAuth2 有相關教程)。算法
本文是 Spring Security 系列第 23 篇,閱讀本系列前面的文章有助於更好的理解本文:數據庫
CAS 全稱叫作中央認證服務,英文是 Central Authentication Service。後端
這是由耶魯大學發起的一個開源項目,目的是幫助 Web 應用系統構建一種可靠的單點登陸解決方案,從目前企業實際項目來看,CAS 仍是很是受歡迎的一種單點登陸解決方案。瀏覽器
CAS 分爲兩部分:tomcat
咱們來看 CAS 的官方給出的一個架構圖:
能夠看到,用戶訪問的是 CAS Clients,CAS Clients 和 CAS Server 之間的通訊支持多種協議,CAS Server 處理具體的認證事宜,CAS Server 對數據源的支持也很是多樣化。
CAS Client 支持的平臺有:
CAS 支持的通訊協議有:
從圖中也能夠看出 CAS 支持多種不一樣的認證機制,具體有:
在 CAS 的整個登陸過程當中,有三個重要的概念,這裏我先來和你們捋一捋。
接下來咱們經過一張官方給出的流程圖來看下 CAS 登陸過程是什麼樣子的!
這張圖其實畫的比較清楚了,我再用文字和你們解釋下:
術語:應用一、應用2 分別表示被保護的應用。
在整個登陸過程當中,瀏覽器分別和 CAS Server、應用一、應用2 創建了會話,其中,和 CAS Server 創建的會話稱之爲全局會話,和應用一、應用2 創建的會話稱之爲局部會話;一旦局部會話成功創建,之後用戶再去訪問應用一、應用2 就不會通過 CAS Server 了。
說了這麼多,來點實際的。
因爲整個 CAS 單點登陸作起來還比較麻煩,咱們一步一步來,今天我先來教你們把 CAS Server 搭建起來。
目前最新的 CAS Server 是 6.x,這個是基於 gradle 來構建的,考慮到不少小夥伴可能不熟悉 gradle 操做,所以這裏我選擇 5.3 的版本,該版本基於你們熟悉的 maven 來構建。
官方爲咱們提供了構建 CAS Server 的模版,地址是:https://github.com/apereo/cas...。
咱們在分支中選擇 5.3 版本下載:
或者直接 clone 下來,而後切換到 5.3 這個分支也能夠。這個應該就不用我教你們了吧,相信小夥伴們都能本身搞定。
CAS Server 從版本 4 開始,要使用 HTTPS 通訊,因此咱們得提早準備 HTTPS 證書。公司裏的項目的話,須要購買 HTTPS 證書,本身玩的話也能夠從雲服務廠商那裏申請到免費的 HTTPS 證書。
如今咱們在本地測試,直接利用 JDK 自帶的 keytool 工具,本身生成一個 HTTPS 證書便可。
生成命令以下:
keytool -genkey -alias casserver -keyalg RSA -keystore ./keystore
證書在執行的時候,須要給一個密鑰庫口令,這個你們隨意給出便可,可是給出了多少要本身記着。另外,在 What is your first and last name?
選項中,須要填入 CAS Server 的域名,這點切記:
如此以後,咱們的 HTTPS 證書就有了,雖然這個證書不被各大廠商承認,可是本身作練習夠用了。
接下來進行配置。
咱們在下載的 cas-overlay-template 項目中,新建 src/main/resources 目錄,並將 overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/application.properties 文件和剛剛生成的 keystore 文件拷貝進來:
而後修改 application.properties ,主要配置一下 keystore 的位置和密鑰,以下:
server.ssl.key-store=classpath:keystore server.ssl.key-store-password=111111 server.ssl.key-password=111111
配置完成後,在項目根目錄下執行以下命令啓動項目:
./build.sh bootrun
根據我的網速,第一次啓動可能會很是漫長,耐心等待便可。
啓動過程當中,也可能會報錯,可是不用管,若是看到 ready 圖標,就表示啓動成功了:
啓動成功後,瀏覽器輸入 https://cas.javaboy.org:8443/cas/login 就能夠進入登陸頁面了(注意是 https 哦):
默認的用戶名是 casuser,密碼是 Mellon,輸入用戶名密碼就能夠登陸了。
默認的用戶名/密碼也能夠在 application.properties 文件中修改,該文件的最後一行:
cas.authn.accept.users=casuser::Mellon
修改完後,重啓項目便可生效。
今天主要和小夥伴聊一下 CAS 的基本概念,而後咱們順手搭建一個 CAS Server 出來,感興趣的小夥伴能夠動手試一試哦~,下篇文章咱們來看如何用 Spring Boot 開發 CAS 客戶端~
好啦,若是小夥伴們以爲有收穫,記得點個在看鼓勵下鬆哥哦~