CAS單點登錄(五)——Service配置及管理
https://blog.csdn.net/Anumbrella/article/details/82119246
在上一節我們講述了CAS中關於自定義認證登錄策略,對CAS中關於自定義登錄配置的方案,校驗策略有了一定的了解,如果忘記了可以去復習一下——————CAS單點登錄(四)——自定義認證登錄策略。這節本來該介紹自定義表單信息的知識,但是考慮到使用自定義表單知識涉及到Service配置方面的知識,所以這一節介紹一下在CAS中Service配置及管理。
首先我們要明白CAS中的Service的概念是什么,我們在第一節就講解了在CAS系統中,主要分為三部分,User、Web應用、SSO認證中心。User就是我們普通用戶,Web應用就是需要接入SSO認證中心的應用也就是這里的Service,而SSO認證中心就是CAS服務端。
簡單來說就是CAS分為服務端和客戶端,而Service就是指具體的多個客戶端(CAS Clients)。
而這里的服務管理(Service Management)就是CAS服務管理工具允許CAS服務器管理員聲明和配置哪些服務(Service,CAS客戶端)可以在哪些方面使用CAS。服務管理工具的核心組件是服務注冊表,它存儲一個或多個注冊服務。
接下來先介紹我們的第一個知識點——Service配置!
一、Service配置
我們剛剛提及到在CAS中,服務管理工具中的服務注冊表當中存儲着一個或多個注冊服務,而這些Service中包含着各個行為的元數據,通過配置這些數據我們可以控制這些Service的行為。
主要行為包括一些幾點:
授權服務 - 控制哪些服務可以參與CAS SSO會話。
強制身份驗證 - 為強制身份驗證提供管理控制。
屬性發布 - 為服務提供用戶詳細信息以進行授權和個性化。
代理控制 - 通過授予/拒絕代理身份驗證功能進一步限制授權服務。
主題控制 - 定義用於特定服務的備用CAS主題。
在Service中配置屬性主要包括以下這些信息:
上圖介紹了一些在Service中常用的配置項,對於各個配置屬性的含義可以參考具體文檔,服務配置。
在這些配置中,比較常使用的主要是:
服務訪問策略——(accessStrategy),具體可以查看:服務策略配置。
服務屬性配置——(properties),具體查看:服務屬性配置。
服務到期政策——(expirationPolicy),具體查看:服務到期配置。
對CAS元數據的配置信息有了大致的了解后,我們需要配置其存儲方式,就像我們前面介紹的多種認證方式一樣,用戶信息提供了多種方式,這里的Service存儲方式也是提供了多種的解決方案。
推薦使用JSON、YAML、MongoDb、Redis、JPA這幾種方式來存儲使用,這里也將使用這幾種方式來介紹。
1、JSON
這種方式也是CAS默認初始化使用的,注冊表在應用程序上下文初始化時從JSON配置文件中讀取服務定義,期望在配置的目錄位置內找到JSON文件。
首先添加依賴包:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-json-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
在resources/services文件夾下面新建web-10000001.json,具體內容如下:
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(https|imaps|http)://.*",
"name" : "web",
"id" : 10000001,
"evaluationOrder" : 10
}
1
2
3
4
5
6
7
注意: Json文件名字規則為${name}-${id}.json,id必須為Json文件內容Json一致。
Json文件解釋:
@class:必須為org.apereo.cas.services.RegisteredService的實現類,對其他屬性進行一個json反射對象,常用的有RegexRegisteredService,匹配策略為id的正則表達式
serviceId:唯一的服務id
name: 服務名稱,會顯示在默認登錄頁
id:全局唯一標志
description:服務描述,會顯示在默認登錄頁
evaluationOrder: 匹配爭取時的執行循序,最好是比1大的數字
因為在CAS服務中,默認是提供了默認的Service配置項,所以如果添加的Json配置沒起作用,可以嘗試注釋掉默認啟動Json,在pom.xml文件里面進行配置,如下:
然后在配置文件application.properties下添加配置:
##
# Service Registry(服務注冊)
#
# 開啟識別Json文件,默認false
cas.serviceRegistry.initFromJson=true
#自動掃描服務配置,默認開啟
#cas.serviceRegistry.watcherEnabled=true
#120秒掃描一遍
cas.serviceRegistry.schedule.repeatInterval=120000
#延遲15秒開啟
# cas.serviceRegistry.schedule.startDelay=15000
##
# Json配置
cas.serviceRegistry.json.location=classpath:/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
啟動服務,我們可以發現注釋掉war包下Json初始化后,默認只啟動了一個Json,在控制台中我們可以發現啟動日志:
如果沒有注釋話,默認會是加載了2個服務配置。
輸入具體地址https://sso.anumbrella.net:8443/cas/login?service=http://localhost:9080/sample,進行登錄,輸入用戶名、密碼登錄成功!然后跳轉到一個http://localhost:9080/sample?ticket=xxxxxxxxxxxxxx的地址。
后面接入的就是指具體的服務地址。說明先前的配置是其作用的,因為配置了http通過服務認證。
但是我們要求的是模擬客戶端登錄,這里暫時沒有准備客戶端接入,后面文章會准備講解,所以我們這里直接使用官方提供的Demo,更改接入地址即可。
這里官方准備的客戶端Demo是Java版本的,地址為:cas-sample-java-webapp
這里我重新給客戶端設置綁定一個client.anumbrella.net域名,同樣在hosts文件下進行映射。
然后我重新導入了一個client.anumbrella.net的證書,如果忘記了操作,可以看一下CAS單點登錄(二)——搭建基礎服務。將證書導入JDK中,可以通過命令查看導入了哪些證書:
查看cacerts中的證書列表:
Windows:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
1
Unix:
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
1
刪除cacerts中指定名稱的證書:
Windows:
keytool -delete -alias taobao -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
1
Unix:
keytool -delete -alias taobao -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
1
進入客戶端,配置webapp下面WEB-INF下面的web.xml文件。如下圖所示:
https://sso.anumbrella.net:8443/cas/login為CAS服務端的地址,而https://client.anumbrella.net:9443為我們客戶端待會要啟動的地址,也就是我們所說的登錄地址。這里我客戶端是使用了https,如果不使用https,這里配置為http://localhost:9080也是可以的。
然后配置我們的證書,如果客戶端沒使用https,直接配置為http://localhost:9080,后面的操作可以不用配置了,前面的證書也不用導入。
配置好證書的地址和密匙即可。接着進入Demo項目的根目錄,執行mvn clean package jetty:run-forked命令,
在瀏覽器中輸入https://client.anumbrella.net:9443/sample,或者輸入http://localhost:9080/sample跳轉到CAS登錄地址,輸入用戶名和密碼,登錄成功!
我們繼續使用先前提到的服務訪問策略進行更改,更改Json配置如下:
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "^(https|imaps|http)://.*",
"name" : "web",
"id" : 10000001,
"evaluationOrder" : 10,
"accessStrategy" : {
"@class" : "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy",
"enabled" : false,
"ssoEnabled" : false
}
}
1
2
3
4
5
6
7
8
9
10
11
12
禁止服務使用,這里就是我們前面提到的服務策略配置,再啟動CAS服務端測試一下。
直接提示我們未認證授權的服務!!!,說明訪問策略起作用了。
2、YAML
yaml配置與json配置基本一致,添加依賴:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-yaml-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
在resources/services文件夾下面新建web-10000001.yml,具體內容如下:
--- !<org.apereo.cas.services.RegexRegisteredService>
serviceId: "^(https|imaps|http)://.*"
name: "web"
id: 10000001
description: "description"
evaluationOrder: 10
attributeReleasePolicy: !<org.apereo.cas.services.ReturnAllAttributeReleasePolicy> {}
accessStrategy: !<org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy>
enabled: true
ssoEnabled: true
1
2
3
4
5
6
7
8
9
10
注意:
yaml文件名字規則為${name}-${id}.yml,id必須為yaml文件內容id一致。其他與Json配置一樣的。
在application.properties更改配置如下:
cas.serviceRegistry.initFromJson=false
cas.serviceRegistry.yaml.location=classpath:/services
1
2
啟動服務,登錄成功!!
3、MongoDb
同樣的先添加依賴:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-mongo-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
在application.properties更改配置如下:
##
# MongoDB配置
#
#ip地址
cas.serviceRegistry.mongo.host=localhost
#cas.serviceRegistry.mongo.clientUri=
cas.serviceRegistry.mongo.idleTimeout=30000
#數據庫端口
cas.serviceRegistry.mongo.port=27017
cas.serviceRegistry.mongo.dropCollection=false
cas.serviceRegistry.mongo.socketKeepAlive=false
#
#密碼
cas.serviceRegistry.mongo.password=admin
cas.serviceRegistry.mongo.collection=cas-service-registry
cas.serviceRegistry.mongo.databaseName=admin
cas.serviceRegistry.mongo.timeout=5000
#用戶名
cas.serviceRegistry.mongo.userId=admin
cas.serviceRegistry.mongo.writeConcern=NORMAL
cas.serviceRegistry.mongo.replicaSet=
cas.serviceRegistry.mongo.sslEnabled=false
cas.serviceRegistry.mongo.conns.lifetime=60000
cas.serviceRegistry.mongo.conns.perHost=10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
這里要注意一下:MongoDB默認需要開啟認證才行,如果不開起認證,啟動CAS會報錯。
我使用的是docker啟動的MongoDB,直接使用的是admin數據庫,用戶名和密碼配置也是添加環境變量啟動的。如果自己搭建的MongoDB數據庫,可以參考一下下面的配置:
MongoDB用戶配置(版本3.4以上)
#啟動
>mongod.exe
#登錄
>mongo
#切換數據庫
>use admin
#新增管理員
>db.createUser({user: "admin",pwd: "admin",roles:[{role:"userAdminAnyDatabase", db: "admin" } ]})
#切換數據庫
>use cas-mongo-database
# 新增用戶
>db.createUser({user: "cas",pwd: "123456",roles: [ { role: "readWrite", db: "cas-mongo-database" }]})
#重啟並開啟認證
>mongod.exe --auth
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
啟動服務后,發現服務提示這樣的信息?如下情況:
這是為啥?因為我們沒有定義可以認證的服務,這就需要我們使用服務管理(Service Management)添加服務數據,或者手動添加數據信息到數據庫中,像Json、Yaml中文件配置的信息一樣。所以暫時可以忽略不用管,后面我會講解如何使用Service Management來添加。
4、Redis
Redis的使用與MongoDB的用法大致相同,這里就不詳細分析了。同樣添加依賴:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-redis-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
添加配置信息:
##
# Redis配置
#
cas.serviceRegistry.redis.host=localhost
cas.serviceRegistry.redis.database=0
cas.serviceRegistry.redis.port=6380
cas.serviceRegistry.redis.password=
cas.serviceRegistry.redis.timeout=2000
cas.serviceRegistry.redis.useSsl=false
cas.serviceRegistry.redis.usePool=true
cas.serviceRegistry.redis.pool.max-active=20
cas.serviceRegistry.redis.pool.maxIdle=8
cas.serviceRegistry.redis.pool.minIdle=0
cas.serviceRegistry.redis.pool.maxActive=8
cas.serviceRegistry.redis.pool.maxWait=-1
cas.serviceRegistry.redis.pool.numTestsPerEvictionRun=0
cas.serviceRegistry.redis.pool.softMinEvictableIdleTimeMillis=0
cas.serviceRegistry.redis.pool.minEvictableIdleTimeMillis=0
cas.serviceRegistry.redis.pool.lifo=true
cas.serviceRegistry.redis.pool.fairness=false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
5、Jpa
最后介紹一下Jpa這種方式,通過Java持久層API來實現數據保存到數據庫,可以是Mysql、Oracle、SQL Service這種方式可能使用的比較多一些。
同樣的先添加依賴:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jpa-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
添加配置信息:
##
# Jpa配置
#
cas.serviceRegistry.jpa.user=root
cas.serviceRegistry.jpa.password=123
cas.serviceRegistry.jpa.driverClass=com.mysql.jdbc.Driver
cas.serviceRegistry.jpa.url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.serviceRegistry.jpa.dialect=org.hibernate.dialect.MySQL5Dialect
cas.serviceRegistry.jpa.failFastTimeout=1
cas.serviceRegistry.jpa.healthQuery=
cas.serviceRegistry.jpa.isolateInternalQueries=false
cas.serviceRegistry.jpa.leakThreshold=10
cas.serviceRegistry.jpa.batchSize=1
#設置配置的服務,一直都有,不會給清除掉 , 第一次使用,需要配置為 create-drop
#create-drop 重啟cas服務的時候,就會給干掉
#create 沒有表就創建,有就不創建
#none 一直都有
#update 更新
cas.serviceRegistry.jpa.ddlAuto=update
cas.serviceRegistry.jpa.autocommit=true
cas.serviceRegistry.jpa.idleTimeout=5000
cas.serviceRegistry.jpa.pool.suspension=false
cas.serviceRegistry.jpa.pool.minSize=6
cas.serviceRegistry.jpa.pool.maxSize=18
cas.serviceRegistry.jpa.pool.maxWait=2000
cas.serviceRegistry.jpa.pool.timeoutMillis=1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
更詳細的驅動信息可以參考文檔:
https://apereo.github.io/cas/5.3.x/installation/JDBC-Drivers.html
啟動服務后,還是和前面一樣,提示CAS的服務記錄是空的,沒有定義服務。 希望通過CAS進行認證的應用程序必須在服務記錄中明確定義。。。暫時可以忽略掉,馬上我們就來配置服務管理。
然后我們去數據庫發現,新增了一些表,這就是CAS將服務信息保存到數據庫使用的表。
二、Service管理
在前面的服務配置中,我們知道了CAS需要先把服務的信息確定下來,無論你是寫在Json、MongoDB、Redis還是數據庫MySQL、Oracle等等中,如果在沒有信息前,你是無法登陸認證的。
而Service管理相當於我們可以動態管理我們自己的服務信息,隨時增加,隨時刪除。
1、服務管理Web應用程序
官方為我們提供了一個管理Web服務的簡單Demo,我們可以直接使用,這個應用服務管理webapp不是CAS服務器的一部分,是單獨的一個服務。
地址:cas-management-overlay
我們然后新建src/main/resources文件夾,在下面新建文件application.properties,添加覆蓋配置如下:
##
# CAS Thymeleaf Views
#
spring.thymeleaf.cache=false
spring.thymeleaf.mode=HTML
spring.thymeleaf.order=1
##
# Embedded CAS Tomcat Container
#
server.context-path=/cas-management
server.port=8081
server.ssl.key-store=calsspath:thekeystore
server.ssl.key-store-password=changeit
server.ssl.key-password=changeit
##
# Log4J Configuration
#
server.context-parameters.isLog4jAutoInitializationDisabled=true
# logging.config=file:/etc/cas/log4j2.xml
##
# CAS Server
#
cas.server.name=https://sso.anumbrella.net:8443
cas.server.prefix=${cas.server.name}/cas
##
# CAS Authentication Attributes
#
cas.authn.attributeRepository.stub.attributes.uid=uid
cas.authn.attributeRepository.stub.attributes.givenName=givenName
cas.authn.attributeRepository.stub.attributes.eppn=eppn
# cas-management服務地址
mgmt.serverName=https://client.anumbrella.net:8081
##
# CAS Web Application Config
#
server.session.timeout=1800
server.session.cookie.http-only=true
server.session.tracking-modes=COOKIE
##
# CAS Cloud Bus Configuration
# Please leave spring.cloud.bus.enabled set to false
#
spring.cloud.bus.enabled=false
#Indicates that systemPropertiesOverride can be used.
# Set to false to prevent users from changing the default accidentally. Default true.
spring.cloud.config.allow-override=true
# External properties should override system properties.
spring.cloud.config.override-system-properties=false
# When allowOverride is true, external properties should take lowest priority, and not override any
# existing property sources (including local config files).
spring.cloud.config.override-none=false
##
# Actuator Endpoint Security Defaults
#
endpoints.sensitive=true
endpoints.enabled=false
endpoints.actuator.enabled=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
這里也是通過覆蓋配置,使用Service Management,這里的cas-management其實也相當於一個客戶端使用,只是它可以用來進行Service的管理配置。
同時新建user-details.properties文件,添加用戶配置,如下:
casuser=notused,ROLE_ADMIN
anumbrella=notused,ROLE_ADMIN
1
2
這里我添加了anumbrella用戶,默認只有casuser用戶。
注意:cas-management啟動需要https,所以我又在Tomcat中的server.xml中添加了一個端口,來啟動cas-management,並使用client.anumbrella.net域名綁定。
還有一個細節注意,如果在同一電腦下啟動CAS服務端,又啟動cas-management,注意端口占用問題。如果出現該問題,啟動一個應用時,把另一個端口注釋掉,當啟動時再打開。
啟動cas-management應用后,發現並不能登錄,又出現剛剛先前那個沒有未認證授權的服務頁面。這是因為cas-management也是一個客戶端(client),所以沒有在數據庫中添加相應信息是不能登錄的。(現在使用的是Jpa模式存儲)
打開數據庫的RegexRegisteredService表,按照我們先前Json一樣的數據進行添加,把要求的必填信息填寫進去就可以了,如下:
這里我就填寫了了id、evaluation_order、name、serviceId這四個字段,分別為1,10,cas-management,^(https|imaps|http)://.*。等大約2分鍾后,配置掃描更改成功后,我們再刷新登錄頁面,輸入密碼登錄成功!
這就是我們需要的cas-management,它提供了完善的service配置信息添加,點擊旁邊的添加按鈕我們可以發現詳細的service添加信息。
無論是基本的service信息,退出路由配置,服務策略配置等等都有。。
我們還可以以不同形式查看,比如以Json查看,這里的信息就是我們先前Json配置的一樣,復制過去就可以使用。這里提供了更為詳細的模板。
目前cas-management只是把信息存儲在內存中,我們需要它指定為我們的數據庫存儲——Jpa方式,同前面的操作一樣。添加依賴,添加配置,
<!-- 數據庫jdbc驅動 -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>${cas.version}</version>
</dependency>
<!-- Jpa Service Registry -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jpa-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
添加配置:
##
# Jpa配置
#
cas.serviceRegistry.jpa.user=root
cas.serviceRegistry.jpa.password=123
cas.serviceRegistry.jpa.driverClass=com.mysql.jdbc.Driver
cas.serviceRegistry.jpa.url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.serviceRegistry.jpa.dialect=org.hibernate.dialect.MySQL5Dialect
cas.serviceRegistry.jpa.failFastTimeout=1
cas.serviceRegistry.jpa.healthQuery=
cas.serviceRegistry.jpa.isolateInternalQueries=false
cas.serviceRegistry.jpa.leakThreshold=10
cas.serviceRegistry.jpa.batchSize=1
#設置配置的服務,一直都有,不會給清除掉 , 第一次使用,需要配置為 create-drop
#create-drop 重啟cas服務的時候,就會給干掉
#create 沒有表就創建,有就不創建
#none 一直都有
#update 更新
cas.serviceRegistry.jpa.ddlAuto=update
cas.serviceRegistry.jpa.autocommit=true
cas.serviceRegistry.jpa.idleTimeout=5000
cas.serviceRegistry.jpa.pool.suspension=false
cas.serviceRegistry.jpa.pool.minSize=6
cas.serviceRegistry.jpa.pool.maxSize=18
cas.serviceRegistry.jpa.pool.maxWait=2000
cas.serviceRegistry.jpa.pool.timeoutMillis=1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
然后我們重啟服務,登錄成功后,會發現先前我們在數據庫中添加的服務信息。然后我們新增一個名為client-demo的服務,接着去數據庫的RegexRegisteredService表查看,會發現完成新信息的添加!這里就實現了cas-management同步管理我們CAS系統Service的增刪改查。
2、自定義接口管理服務
我們發現管理CAS每次都要啟動一個cas-management,實在是麻煩,難道沒簡單方法嗎?其實我們可以自己去實現數據的操作。
這里有兩個思路,1、直接操作數據庫,或者我們需要存儲的文件,直接把需要的信息寫進去。2、利用CAS提供的接口來實現操作。
這里講解一下利用CAS提供的接口來實現操作,我們知道cas-management其實就是封裝了一下界面,然后調用提供的接口,直接操作增刪改查。
我們也可以在CAS服務添加一個Restful類似的接口,通過CAS中的ServicesManager來操作services。我們可以查看一下ServicesManager源碼:
ServicesManager是一個接口,封裝了我們增刪改查的各種方法,簡直nice!需要的就是它。
使用自定義接口需要依賴庫:
<!-- Services Management -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-services-api</artifactId>
<version>${cas.version}</version>
</dependency>
<!-- Authentication Attributes -->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-authentication-attributes</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
接着我們自定義controller層如下:
package net.anumbrella.sso.controller;
import org.apereo.cas.services.RegexRegisteredService;
import org.apereo.cas.services.RegisteredService;
import org.apereo.cas.services.ReturnAllAttributeReleasePolicy;
import org.apereo.cas.services.ServicesManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.net.URL;
/**
* @author anumbrella
*/
@RestController
@RequestMapping("/services")
public class ServicesManagerController {
@Autowired
@Qualifier("servicesManager")
private ServicesManager servicesManager;
/**
* 添加cas客戶端
* 增加了單點退出功能,cas退出默認使用隱式退出
* protocol 代表的是協議,比如: http或者https的協議
*/
@RequestMapping(value = "/addClient/{protocol}/{serviceId}/{id}", method = RequestMethod.GET)
public String addService(@PathVariable("serviceId") String serviceId, @PathVariable("protocol") String protocol
, @PathVariable("id") int id) throws IOException {
String url = protocol + "://" + serviceId;
RegisteredService svc = servicesManager.findServiceBy(url);
if (svc != null) {
return "0";
}
//serviceId,可以配置為正則匹配
String a = "^" + url + ".*";
RegexRegisteredService service = new RegexRegisteredService();
ReturnAllAttributeReleasePolicy re = new ReturnAllAttributeReleasePolicy();
service.setServiceId(a);
service.setId(id);
service.setAttributeReleasePolicy(re);
//將name統一設置為servicesId
service.setName(serviceId);
//單點登出
service.setLogoutUrl(new URL(url));
servicesManager.save(service, true);
servicesManager.load();
return "1";
}
/**
* 刪除服務
*
* @param serviceId
* @return
*/
@RequestMapping(value = "/delete/{serviceId}", method = RequestMethod.GET)
public String delService(@PathVariable("serviceId") String serviceId) {
String res = "";
RegisteredService svc = servicesManager.findServiceBy(serviceId);
if (svc != null) {
try {
servicesManager.delete(svc);
} catch (Exception e) {
if (null == servicesManager.findServiceBy(serviceId)) {
res = "success";
servicesManager.load();
} else {
res = "failed";
}
}
}
return res;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
最后在resources下的META-INF文件下的spring.factories注入spring boot的配置,
啟動服務訪問我們設置的路由,傳入數據,如下:
最后我們去數據庫可以發現我們添加的服務信息。
因此我們可以在Restful中進行服務的管理。
代碼實例:Chapter4
參考
CAS單點登錄-Service配置(七)
CAS5.2x單點登錄(六)-----動態添加services
CAS單點登錄-Cas-Management(八)
https://apereo.github.io/cas/5.3.x/installation/Service-Management.html
————————————————
版權聲明:本文為CSDN博主「Anumbrella」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Anumbrella/article/details/82119246