微服務開發之單點登入
關於CAS
CAS是一種單點登入開源框架,遵循apache2.0協議,程式碼託管在github.com/apereo/cas上。
而單點登入(SSO, Single Sign On)可簡單理解為當用戶在一個應用上登入了,其他被授權信任的關聯應用不用再登入。
比如在同一個瀏覽器中登入了天貓,再開啟淘寶網站時會自動登入,無需單獨輸使用者名稱密碼或掃二維碼。以下簡單說明下CAS的部署與測試結果。
本地測試環境
jdk8
tomcat8.5
gradle-4.3.1
cas4.2.7
下載及編譯cas
$wget "https://github.com/apereo/cas/archive/v4.2.7.tar.gz"
$tar -zxf v4.2.7.tar.gz
$cd cas-4.2.7/cas-server-webapp
$gradle build
編譯完成後可在當前路徑的build/libs/
找到編譯打包出來的war檔案cas-server-webapp-4.2.7.war
;將其重新命名為cas.war
後,複製到tomcat的web工作目錄webapps/
下。
tomcat ssl證書配置
具體流程可參考網上資料,這裡暫不展開討論。配置好ssl證書後,在tomcat目錄下的conf/server.xml
增加類似如下配置:
<Connector port="8443" protocol ="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/Users/apple/Documents/cas/castestkey"
keystorePass="xxxx"/>
修改hosts
假設測試環境為本機,我們除了啟動一個cas server,還將啟動啟動兩個application server用於單點登入測試。以下為這三個節點的本地host配置:
127.0.0.1 sso.cas.com
127.0.0.1 app1.cas.com
127.0.0.1 app2.cas.com
訪問cas服務
tomcat起來後,我們可以這樣訪問cas服務:https://sso.cas.com:8443/cas/login
登入介面如下所示:
編譯並執行測試服務
我的測試程式碼基於這原始碼專案進行了部分修改:https://github.com/willwu1984/springboot-cas-shiro。
對專案通過mvn package
命令完成打包後, 在》/target
下找到可執行檔案cas-0.0.1-SNAPSHOT.jar
。
啟動測試服務:
$java -jar target/cas-0.0.1-SNAPSHOT.jar
// ...
2018-07-13 15:32:04.542 INFO 72755 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 18091 (http)
2018-07-13 15:32:04.547 INFO 72755 --- [ main] cas.Application : Started Application in 5.087 seconds (JVM running for 5.65)
這時我們瀏覽器訪問 http://app1.cas.com:18091/
, 會發現頁面首先被重定向到cas登入認證頁面:
https://sso.cas.com:8443/cas/login?service=http://app1.cas.com:18091/shiro-cas
因為當前並沒真正接入資料庫,可輸入預設使用者名稱:密碼(casuser:Mellon)進行測試, 這時會跳轉回到測試服務的主頁:
這時我們執行另外一個測試應用服務,假設地址為 http://app2.cas.com:18092/
。
在同一個瀏覽器中訪問該地址時,會發現已經自動完成登入並進入主介面。