1. 程式人生 > >CAS5.3單點登入服務端搭建與整合springboot

CAS5.3單點登入服務端搭建與整合springboot

什麼是單點登入
單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。
SSO是概念,實現SSO需要用到CAS框架

使用cas框架實現單點登陸
有多個不同伺服器的web層需要登陸。就要使用cas。在一個web層頁面登入,其他頁面都不需要登入就能訪問
www.taobao.com car.taobao.com。 只需要在登陸中心(cas服務端)登入一次就能訪問全部不同伺服器的頁面

 

 

CAS
是開源的企業級單點登陸解決方案
CAS Server是獨立部署的web應用,下載下來用包war複製到tomcat啟動,CAS專案中配置檔案設定了tomcat的埠是8080。自行修改,預設是Https協議,開發時要關閉Https認證協議

 

 

 

CAS Client(自己的web專案)支援非常多的客戶端(這裡指單點登入系統中的各個Web應用),包括Java,PHP等

CAS包含兩個部分:CAS Server和CAS Client,
CAS Server需要獨立部署,主要負責對使用者的認證工作;
CAS Client負責處理對客戶端受保護資源的訪問請求,需要登陸時,重定向到CAS Server

第四步會其實會經過瀏覽器再跳轉到CAS Client


SSO單點登入訪問流程:
1.訪問服務:SSO客戶端傳送請求訪問應用系統提供的服務資源
2.定向認證:SSO客戶端會重定向使用者請求到SSO伺服器
3.使用者認證:使用者身份認證
4.發放票據:SSO伺服器會產生一個隨機的Service Ticket
5.驗證票據:SSO伺服器驗證票據Service Ticket的合法性,驗證通過後,允許客戶端訪問服務
6.傳輸使用者資訊:SSO伺服器驗證票據通過後,傳輸使用者認證結果資訊給客戶端

 

搭建CSA伺服器

Cas服務端其實就是一個war包,
到官方下載https://www.apereo.org/projects/cas/download-cas,這裡下載的是war包,但是是2016年的4.x版本,
上面網址給需要直接下載war的人用

我們想找較新的版本,但是新版本已經不提供war,需要自己來打成war包,這裡下載5.x的新版本
https://github.com/apereo/cas-overlay-template下載5.3分支

image.png

 

解壓後進行目錄,build一下專案 ,過程有點慢,耐心等待

 

 

 

 

 


多了一個target資料夾

image.png


點入資料夾

 


把cas.war放到tomcat的webapp中,啟動tomcat
訪問http://localhost:8080/cas

 


啟動成功

 


預設使用者名稱和密碼cas\WEB-INF\classes\application.properties

 

 

使用者名稱:casuser 密碼:Mellon

 


CAS服務端啟動成功

 

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

如果不去除https認證下面整合客戶端時會出現未認證授權的服務

image.png


修改CAS服務端配置檔案
cas\WEB-INF\classes目錄的application,properties新增如下的內容
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
cas\WEB-INF\classes\services目錄下的HTTPSandIMAPS-10000001.json
修改內容如下,即新增http
"serviceId" : "^(https|http|imaps)://.*",

 

CAS客戶端配置(就是自己專案)

pom.xml依賴

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

application.properties配置檔案
客戶端1
server.port=8088
#cas服務端的地址
cas.server-url-prefix=http://localhost:8080/cas
#cas服務端的登入地址
cas.server-login-url=http://localhost:8080/cas/login
#當前伺服器的地址(客戶端)
cas.client-host-url=http://localhost:8088
#Ticket校驗器使用Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=CAS3

每個客戶端只要修改當前伺服器地址就行了
如客戶端2
server.port=8090
#cas服務端的地址
cas.server-url-prefix=http://localhost:8080/cas
#cas服務端的登入地址
cas.server-login-url=http://localhost:8080/cas/login
#當前伺服器的地址(客戶端)
cas.client-host-url=http://localhost:8090
#Ticket校驗器使用Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=CAS3

配置完成
沒有登陸時http://localhost:8088http://localhost:8090訪問都會跳到CAS 登陸頁
只要客戶端1登陸了,登陸端2就能直接訪問,反之也能訪問

上面是通過CAS預設的使用者名稱和密碼進行登入的,實際專案中我們的使用者名稱和密碼肯定是從資料庫中獲取到的
官方文件https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html
接下來我們就看一下怎麼通過獲取資料庫的使用者進行驗證
配置CAS服務端
G:\google下載\cas-overlay-template-5.3的pox.xml來開啟專案
pom.xml檔案加上依賴
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
cmd進入命令 mvn clean package命令的時候會重新生成一個war包
把war放到tomcat中解壓
cas\WEB-INF\classes目錄的application.properties
首先註釋掉預設的使用者#cas.authn.accept.users=casuser::Mellon
新增如下的內容
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=utf-8&useSSL=true
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=a1234567
cas.authn.jdbc.query[0].sql=select * from user where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver

需要加上之前去掉https的配置

**注意 mysql6.0以上版本配置有些不同 參考
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=utf-8&useSSL=true&autoReconnect=true&failOverReadOnly=false&autoReconnect=true&serverTimezone=UTC
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=a1234567
cas.authn.jdbc.query[0].sql=select * from user where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver