1. 概述

1.1. 什麼是SSO?

單點登入( Single Sign-On , 簡稱 SSO )是目前比較流行的服務於企業業務整合的解決方案之一, SSO 使得在多個應用系統中,使用者只需要 登入一次 就可以訪問所有相互信任的應用系統。

1.2. 什麼是CAS?

隨著SSO技術的流行,相關產品也比較多,其中CAS就是一套解決方案,CAS(Central Authentication Service)中文翻譯為統一身份認證服務或中央身份服務,它由服務端和客戶端組成,實現SSO,並且容易進行企業應用的整合。

CAS是Yale大學(耶魯)發起的一個開源專案,旨在為web應用系統提供一種可靠的單點登入方法,CAS在2004年12月正式成為JA-SIG的一個專案。

官網:https://www.apereo.org/projects/cas

CAS具有以下的特點:

  • 開源的企業級單點登入解決方案
  • CAS Server為需要獨立部署的web應用
  • CAS Client支援非常多的客戶端(這裡指單點登入系統中的各個web應用),包括 Java、.Net 、ISAPI、Php、Perl、uPortal、Acegi、Ruby、VBScript等客戶端

有了CAS,我們的系統架構就演變成下面這樣的:

從架構上可以看出,CAS包含兩個部分:CAS Server和CAS Client.

  • CAS Server需要獨立部署,主要負責對使用者的認證工作,CAS Client負責處理
  • 對客戶端受保護資源的訪問請求,需要登入,重定向到CAS Server。

下面,我們一步步搭建CAS實現SSO.

1.3. 開發環境要求

Jdk1.8+ maven3.6 idea tomcat9.0+ windows10

2. CAS Server伺服器端

2.1. CAS伺服器端軟體包下載

  • 下載版本為5.3

下載伺服器的overlay地址: https://github.com/apereo/cas-overlay-template/tree/5.3

壓縮包:cas-overlay-template-5.3.zip

解壓好後用命令:build.cmd package

然後用編譯的目錄檢視war包:

2.2. 伺服器端的基本部署和測試

將war包放到tomcat的webapp中,然後啟動tomcat

訪問地址:http://localhost:8080/cas 或者 http://localhost:8080/cas/login

預設使用者名稱和密碼在webappscasWEB-INFclassesapplication.properties裡面 使用者名稱:casuser 密碼:Mellon

CAS服務端啟動成功

2.3. CAS Server伺服器配置

2.3.1 去除https認證

CAS預設使用的是HTTPS協議,如果使用HTTPS協議需要SSL安全證書(需向特定的機構申請和購買)。如果對安全要求不高或是在開發測試階段,可使用HTTP協議。我們這裡講解通過修改配置,讓CAS使用HTTP協議。

修改CAS服務端配置檔案:

casWEB-INFclassesapplication.properties裡新增如下內容:

cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true

casWEB-INFclassesservices目錄下的HTTPSandIMAPS-10000001.json修改內容如下:

"serviceId" : "^(https|http|imaps)://.*"

3. CAS Client客戶端配置(自己專案)

Pom檔案的依賴即pom.xml

<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>2.1.0-GA</version>
</dependency>

application.yml配置檔案

客戶端1

server:
port: 9010
cas:
server-url-prefix: http://localhost:8080/cas
server-login-url: http://localhost:8080/cas/login
client-host-url: http://localhost:9010
validation-type: cas3

注:啟動類追加開啟CAS的註解@EnableCasClient

專案中新建一個測試類

import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@Api(description = "SSO-CAS的測試")
public class TestController { @GetMapping("/test1")
public String test1(){
return "test1....";
}
}

客戶端2

server:
port: 9011
cas:
server-url-prefix: http://localhost:8080/cas
server-login-url: http://localhost:8080/cas/login
client-host-url: http://localhost:9011
validation-type: cas3

注:啟動類追加開啟CAS的註解@EnableCasClient

專案中新建一個測試類

import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@Api(description = "SSO-CAS的測試")
public class TestController { @GetMapping("/test2")
public String test1(){
return "test2....";
}
}

客戶端1,客戶端2和cas伺服器搭建好之後,接下來我們進行測試:

1.首先啟動tomcat伺服器中的CAS Server。

2.分別啟動客戶端1和客戶端2,然後在瀏覽器位址列輸入客戶端1的地址http://localhost:9010/test1

在不登入的狀態,在瀏覽器的位址列繼續輸入客戶端2的地址:http://localhost:9011/test2

當我們在其中一個登入介面登入賬號後(假設登入客戶端2)就會跳轉到登陸後的介面,如下圖:

我們再次在瀏覽器視窗重新輸入客戶端1,http://localhost:9010/test1,或者在剛剛輸入客戶端頁面重新重新整理,不用登入即可進入頁面,如下圖:

以上就是單點登入的測試。