1. 程式人生 > >CAS5.3伺服器搭建及SpringBoot整合CAS解決分散式系統安全

CAS5.3伺服器搭建及SpringBoot整合CAS解決分散式系統安全

單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。
當我們使用SpringCloud搭建分散式系統後,這些子系統是分別部署在不同的伺服器中,那麼使用傳統方式的session是無法解決的,我們需要使用相關的單點登入技術來解決。
CAS的原理如下
這裡寫圖片描述

從結構上看,CAS 包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署,主要負責對使用者的認證工作;CAS Client 負責處理對客戶端受保護資源的訪問請求,需要登入時,重定向到 CAS Server
SSO單點登入訪問流程主要有以下步驟:
1. 訪問服務:SSO客戶端傳送請求訪問應用系統提供的服務資源。
2. 定向認證:SSO客戶端會重定向使用者請求到SSO伺服器。
3. 使用者認證:使用者身份認證。
4. 發放票據:SSO伺服器會產生一個隨機的Service Ticket。
5. 驗證票據:SSO伺服器驗證票據Service Ticket的合法性,驗證通過後,允許客戶端訪問服務。
6. 傳輸使用者資訊:SSO伺服器驗證票據通過後,傳輸使用者認證結果資訊給客戶端。

接下來搭建CAS5.3
首先到官方的gihub上下載cas,注意最新的master分支使用的需要java11,該分支使用Gradle工程
由於我使用的是java8,就使用基於5.3版本的,該版本使用Maven工程
CAS4.x的server是基於Spring的,模版引擎使用的是JSP,
CAS5.X之後使用的是基於SpringBoot的,模版引擎使用Thymeleaf,Tymeleaf比JSP要優雅多了
https://github.com/apereo/cas-overlay-template/tree/5.3
解壓後使用maven命令打包
mvn package
把target下生成的war包重新命名為cas.war放到tomcat下
啟動tomcat
找到解壓的檔案

由於CAS預設使用的是基於https協議,需要改為相容使用http協議
到C:\apache-tomcat-8.5.33\webapps\cas\WEB-INF\classes目錄的application,properties新增如下的內容

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

到C:\apache-tomcat-8.5.33\webapps\cas\WEB-INF\classes\services目錄下的HTTPSandIMAPS-10000001.json
修改內容如下,即新增http

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

相容http修改完畢,由於https協議預設使用的埠為8443,我們修改為tomcat的8080埠
到C:\apache-tomcat-8.5.33\webapps\cas\WEB-INF\classes目錄的application,properties新增如下的內容

server.port=8080

由於使用的靜態密碼為casuser::Mellon不好記憶,
修改密碼
到C:\apache-tomcat-8.5.33\webapps\cas\WEB-INF\classes目錄的application,properties的最後面修改密碼為如下

cas.authn.accept.users=admin::admin

CAS伺服器搭建完畢,重啟tomcat
接下來搭建springboot專案的客戶端

在新建的springboot專案的pom.xml新增如下依賴


        <!-- https://mvnrepository.com/artifact/net.unicon.cas/cas-client-autoconfig-support -->
        <dependency>
            <groupId>net.unicon.cas</groupId>
            <artifactId>cas-client-autoconfig-support</artifactId>
            <version>1.7.0-GA</version>
        </dependency>

在pom.xml做如下配置,配置內容意思很簡單,配置內容的原理上面也說到,當訪問分散式系統的資源時,會檢驗有沒有ticket,沒有ticket的話會跳轉到登入介面,登入成功後要跳轉回來當前訪問的資源

cas:
  server-url-prefix: http://localhost:8080/cas
  server-login-url: http://localhost:8080/cas/login
  client-host-url: http://localhost:9100
  validation-type: cas

server:
  port: 9100

啟動CAS @EnableCasClient


@EnableCasClient
@SpringBootApplication
public class CasStarterApplication {

    public static void main(String[] args) {
        SpringApplication.run(CasStarterApplication.class, args);
    }
}

接下來寫一個rest介面測試

@RestController
public class TestController {

    @GetMapping("/test")
    public String get(){
        return "test success";
    }
}

訪問localhost:9100/test
跳轉到登入介面
這裡寫圖片描述
輸入使用者密碼admin:admin 就跳轉到當前訪問的資源
這裡寫圖片描述
後面再更新文章闡述使用資料庫代替靜態的使用者密碼,和修改登入介面