前面我們整合客戶端的時候,需要在cas服務(wù)端注冊,使用的是json文件的方式,直接通過配置文件完成配置,但是也存在一定的不方便性。
假如,我們以域名配置的,比如:http://app1.cas.com 注冊,那么又有新的模塊為 http://app2.cas.com 我們總不能每次修改配置,重啟cas服務(wù)吧榛搔。這很不現(xiàn)實(shí),官網(wǎng)給出了如下的解決方式,將數(shù)據(jù)庫來存儲這些數(shù)據(jù)。
具體參考官網(wǎng)
https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html#database-service-registry
https://apereo.github.io/cas/5.3.x/installation/JPA-Service-Management.html
https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties-Common.html#database-settings
pom添加依賴
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jpa-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-services-api</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-authentication-attributes</artifactId>
<version>${cas.version}</version>
</dependency>
application.properties添加以下屬性
##
# 動態(tài)service 注冊配置
#
#數(shù)據(jù)庫用戶名
cas.serviceRegistry.jpa.user=root
#數(shù)據(jù)庫密碼
cas.serviceRegistry.jpa.password=123456
#mysql驅(qū)動
cas.serviceRegistry.jpa.driverClass=com.mysql.jdbc.Driver
#數(shù)據(jù)庫連接
cas.serviceRegistry.jpa.url=jdbc:mysql://127.0.0.1:3306/sso?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.serviceRegistry.jpa.dialect=org.hibernate.dialect.MySQL5Dialect
#連接池配置
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
#默認(rèn)為create-drop煌往,表示每次啟動服務(wù)都會清除你之前注冊的cas服務(wù)祈纯,生產(chǎn)環(huán)境生成表結(jié)構(gòu)后需要修改配置為update
cas.serviceRegistry.jpa.ddlAuto=update
停止服務(wù),將會刪除之前創(chuàng)建的service
為了避免重啟服務(wù),導(dǎo)致之前的services丟失,需要將
cas.serviceRegistry.jpa.ddlAuto=update
每次啟動之后,會在mysql中自動生成以下表格
增加http接口,操作數(shù)據(jù)庫添加或刪除service
package com.thtf.cas.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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.net.URL;
/**
* ========================
* Created with IntelliJ IDEA.
* User:pyy
* Date:2019/6/27
* Time:14:56
* Version: v1.0
* ========================
*/
@RestController
public class ServiceController {
private Logger logger = LoggerFactory.getLogger(ServiceController.class);
@Autowired
@Qualifier("servicesManager")
private ServicesManager servicesManager;
/**
* 注冊service
* @param serviceId 域名
* @param id 順序
* @return
*/
@GetMapping("/addClient/{serviceId}/{id}")
public Object addClient(@PathVariable("serviceId") String serviceId, @PathVariable("id") int id) {
try {
String a="^(https|imaps|http)://"+serviceId+".*";
RegexRegisteredService service = new RegexRegisteredService();
ReturnAllAttributeReleasePolicy re = new ReturnAllAttributeReleasePolicy();
service.setServiceId(a);
service.setId(id);
service.setAttributeReleasePolicy(re);
service.setName("login");
//這個是為了單點(diǎn)登出而作用的
service.setLogoutUrl(new URL("http://"+serviceId));
servicesManager.save(service);
//執(zhí)行l(wèi)oad讓他生效
servicesManager.load();
ReturnMessage returnMessage = new ReturnMessage();
returnMessage.setCode(200);
returnMessage.setMessage("添加成功");
return returnMessage;
} catch (Exception e) {
logger.error("注冊service異常",e);
ReturnMessage returnMessage = new ReturnMessage();
returnMessage.setCode(500);
returnMessage.setMessage("添加失敗");
return returnMessage;
}
}
/**
* 刪除service異常
* @param serviceId
* @return
*/
@GetMapping("/deleteClient/{serviceId}/{id}")
public Object deleteClient(@PathVariable("serviceId") String serviceId,@PathVariable("id") int id) {
try {
// String a="^(https|imaps|http)://"+serviceId+".*";
// String a="^(https|imaps|http)://"+serviceId+".*";
// RegexRegisteredService service = new RegexRegisteredService();
// ReturnAllAttributeReleasePolicy re = new ReturnAllAttributeReleasePolicy();
// service.setServiceId(a);
// service.setId(id);
// service.setAttributeReleasePolicy(re);
// service.setName("login");
// //這個是為了單點(diǎn)登出而作用的
// service.setLogoutUrl(new URL("http://"+serviceId));
String aa = "http://app2.cas.com:8082";
RegisteredService service = servicesManager.findServiceBy(aa);
servicesManager.delete(service);
//執(zhí)行l(wèi)oad生效
servicesManager.load();
ReturnMessage returnMessage = new ReturnMessage();
returnMessage.setCode(200);
returnMessage.setMessage("刪除成功");
return returnMessage;
} catch (Exception e) {
logger.error("刪除service異常",e);
ReturnMessage returnMessage = new ReturnMessage();
returnMessage.setCode(500);
returnMessage.setMessage("刪除失敗");
return returnMessage;
}
}
public class ReturnMessage{
private Integer code;
private String message;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
}
配置集成SwaggerAPI集成
- 第一種方式:
引入依賴包即可:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-documentation-swagger</artifactId>
<version>${cas.version}</version>
</dependency>
cas已經(jīng)配置好swagger,啟動即可使用
- 第二種方式:
手動配置:
引入依賴:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
編寫swagger配置類:
package com.thtf.cas.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration("casSwaggerConfiguration")
@EnableSwagger2
public class CasSwaggerConfiguration {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(new ApiInfoBuilder()
.title("CAS Swagger API Documentation")
.license("Apache v2")
.licenseUrl("https://github.com/apereo/cas/blob/master/LICENSE")
.description("CAS Swagger API Documentation")
.version("1.0.0")
.build());
}
}
添加ServiceController類和Swagger配置類到:META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.thtf.cas.config.CustomAuthenticationConfiguration,\
com.thtf.cas.config.CasSwaggerConfiguration,\
com.thtf.cas.controller.ServiceController
注意:
如果不添加楣号,這個兩個類不會被系統(tǒng)識別
以下Swagger端點(diǎn)可用于分析和測試API:
描述 | 網(wǎng)址 |
---|---|
Swagger API規(guī)范 | http://localhost/cas/v2/api-docs |
Swagger UI | http://localhost/cas/swagger-ui.html |
啟動
訪問:http://localhost:8443/cas/swagger-ui.html
測試
-
此時我們就可以通過接口完成service的添加最易,刪除等操作
-
查看數(shù)據(jù)庫表
總結(jié)
此中方式可以更加方便管理service,而不用每次有新的應(yīng)用接入時重啟cas-server服務(wù)器炫狱。
而且后面我們可以通過操作regexregisterdservice
表 完成對service的管理