CAS单点登录:动态添加service(四)

news/2024/9/29 13:24:09

1.简介

在CAS系统中,主要分为三部分,User、Web应用、SSO认证中心。

User就是我们普通用户,Web应用就是需要接入SSO认证中心的应用也就是这里的Service,而SSO认证中心就是CAS服务端。

简单来说就是CAS分为服务端和客户端,而Service就是指具体的多个客户端(CAS Clients)。

我们整合客户端的时候,需要在cas服务端注册,使用的是json文件的方式。不是很方便,这里我们提供接口,动态操作。

2.引入依赖

修改pom.xml,如下:

复制代码
<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>
<dependency><groupId>org.apereo.cas</groupId><artifactId>cas-server-support-jdbc</artifactId><version>${cas.version}</version>
</dependency>
<dependency><groupId>org.apereo.cas</groupId><artifactId>cas-server-support-jdbc-drivers</artifactId><version>${cas.version}</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.36</version>
</dependency>
复制代码

排除war包自带的两个json,添加节点:dependentWarExcludes

复制代码
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.6</version><configuration><warName>cas</warName><failOnMissingWebXml>false</failOnMissingWebXml><recompressZippedFiles>false</recompressZippedFiles><archive><compress>false</compress><manifestFile>${manifestFileToUse}</manifestFile></archive><overlays><overlay><groupId>org.apereo.cas</groupId><artifactId>cas-server-webapp${app.server}</artifactId></overlay></overlays><dependentWarExcludes>**/services/*.json</dependentWarExcludes></configuration>
</plugin>
复制代码

3.application.properties添加以下属性

第一次启动使用create-drop,二次运行时改为update

复制代码
##
# Jpa配置
#
cas.serviceRegistry.jpa.user=root
cas.serviceRegistry.jpa.password=123456
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.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
#设置配置的服务,一直都有,不会给清除掉,第一次使用,需要配置为 create-drop
#create-drop 重启cas服务的时候,就会给干掉
#create  没有表就创建,有就不创建
#none 一直都有
#update 更新
cas.serviceRegistry.jpa.ddlAuto=create-drop
复制代码

4.添加rest接口

其实主要是使用ServiceManager中的接口,包名:org.apereo.cas.services.ServicesManager

复制代码
public interface ServicesManager {RegisteredService save(RegisteredService registeredService);RegisteredService save(RegisteredService registeredService, boolean publishEvent);void deleteAll();RegisteredService delete(long id);RegisteredService delete(RegisteredService svc);RegisteredService findServiceBy(String serviceId);RegisteredService findServiceBy(Service service);Collection<RegisteredService> findServiceBy(Predicate<RegisteredService> clazz);<T extends RegisteredService> T findServiceBy(Service serviceId, Class<T> clazz);<T extends RegisteredService> T findServiceBy(String serviceId, Class<T> clazz);RegisteredService findServiceBy(long id);Collection<RegisteredService> getAllServices();boolean matchesExistingService(Service service);boolean matchesExistingService(String service);Collection<RegisteredService> load();default int count() {return 0;}default Collection<RegisteredService> getServicesForDomain(String domain) {return this.getAllServices();}default Collection<String> getDomains() {return (Collection)Stream.of("default").collect(Collectors.toList());}
}
复制代码

 接口的具体实现类:

复制代码
import com.fdzang.cas.service.domain.ServiceDO;
import com.fdzang.cas.service.framework.ApiResult;
import com.fdzang.cas.service.framework.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
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.*;import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;@Slf4j
@RestController
@RequestMapping("/service")
public class ServiceController extends BaseController {@Autowired@Qualifier("servicesManager")private ServicesManager servicesManager;@PostMappingpublic ApiResult addService(@RequestBody ServiceDO service) throws Exception {RegisteredService registeredService = findByServiceId(service.getServiceId());if (registeredService != null) {return fail("serviceId:" + service.getServiceId() + " 已存在");}RegexRegisteredService regexRegisteredService = covertService(service);servicesManager.save(regexRegisteredService, true);servicesManager.load();registeredService = findByServiceId(service.getServiceId());return ok(covertRegisteredService(registeredService));}@DeleteMappingpublic ApiResult delService(@RequestParam("serviceId") String serviceId) {boolean flag = false;RegisteredService registeredService = findByServiceId(serviceId);if (registeredService != null) {try {servicesManager.delete(registeredService);} catch (Exception e) {//这里会报审计错误,直接进行捕获即可,不影响删除逻辑log.error(e.getMessage());}if (null == findByServiceId(serviceId)) {servicesManager.load();flag = true;}}else{return fail("serviceId:" + serviceId + " 不存在");}if (flag){return ok("删除成功");}else{return fail("删除失败");}}@GetMapping("/all")public ApiResult getAllService() {Collection<RegisteredService> allServices = servicesManager.getAllServices();return ok(covertRegisteredServiceList(allServices));}@GetMappingpublic ApiResult getByServiceId(@RequestParam("serviceId") String serviceId) {RegisteredService service = findByServiceId(serviceId);return ok(covertRegisteredService(service));}private ServiceDO covertRegisteredService(RegisteredService registeredService) {ServiceDO service = new ServiceDO();service.setServiceId(registeredService.getServiceId());service.setDescription(registeredService.getDescription());service.setEvaluationOrder(registeredService.getEvaluationOrder());service.setId(registeredService.getId());service.setName(registeredService.getName());service.setTheme(registeredService.getTheme());return service;}private List<ServiceDO> covertRegisteredServiceList(Collection<RegisteredService> registeredServices) {if (CollectionUtils.isEmpty(registeredServices)) {return null;}List<ServiceDO> services = new ArrayList<>();for (RegisteredService registeredService : registeredServices) {services.add(covertRegisteredService(registeredService));}return services;}private RegexRegisteredService covertService(ServiceDO service) throws Exception {RegexRegisteredService regexRegisteredService = new RegexRegisteredService();String serviceId = "^(https|imaps|http)://" + service.getServiceId() + ".*";ReturnAllAttributeReleasePolicy returnAllAttributeReleasePolicy = new ReturnAllAttributeReleasePolicy();regexRegisteredService.setServiceId(serviceId);regexRegisteredService.setId(service.getId());regexRegisteredService.setDescription(service.getDescription());regexRegisteredService.setEvaluationOrder(service.getEvaluationOrder());if (StringUtils.isNotBlank(service.getTheme())) {regexRegisteredService.setTheme(service.getTheme());}regexRegisteredService.setAttributeReleasePolicy(returnAllAttributeReleasePolicy);regexRegisteredService.setName(service.getName());regexRegisteredService.setLogoutUrl(new URL("http://" + service.getServiceId()));return regexRegisteredService;}public RegisteredService findByServiceId(String serviceId){RegisteredService service = null;serviceId = "http://" + serviceId;try {service = servicesManager.findServiceBy(serviceId);} catch (Exception e) {log.error(e.getMessage());}return service;}
}
复制代码

这个地方,我自定义了ServiceDO用来数据的接收及展示。

自定义了ApiResult,统一返回结果。

5.添加包扫描配置

cas项目,其实也是集成的Springboot,这里我们自定义注解完成包扫描工作,后续新的类加进来,无需再修改spring.factories

复制代码
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.fdzang.cas")
public class SpringConfig {
}
复制代码

修改spring.factories,加入我们的包扫描配置。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.apereo.cas.config.CasEmbeddedContainerTomcatConfiguration,\org.apereo.cas.config.CasEmbeddedContainerTomcatFiltersConfiguration,\com.fdzang.cas.service.config.SpringConfig

 

 

 

 

参考:https://blog.csdn.net/qq_34021712/article/details/81638090

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/45417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

linux命令lshw

lshw是一个提取机器硬件配置详细信息的小工具。 它可以在DMI卡上报告准确的内存配置、固件版本、主板配置、CPU版本和速度、缓存配置、总线速度等,可支持x86或IA-64系统,并且在一些PowerPC机器上(已知PowerMac G4可以工作)。用法 ​ lshw [指定格式] [指定参数] 格式选项 -h…

CAJ文件怎么打开?可以转成word吗?

随着科技的发展,文档格式的多样性成为我们日常工作中不可避免的一部分。CAJ文件,作为一种特殊的文档格式,常常困扰着许多用户。那么,究竟什么是CAJ文件格式?我们又该如何将其转换为常用的Word文档呢?接下来,让我们一起深入了解。 打开CAJ文档非常简单,只需要下载官方的…

自定义F类中U类指针管理(UEC++CollectGarbage)

UObject 系统和垃圾回收 UObject:UObject及子类由UE的垃圾回收(GC)系统管理。UE使用引用计数来跟踪对象的生命周期。当一个UObject实例不再被任何强引用持有时,GC会将其标记为可回收。 标记-清除(Mark-and-Sweep):UE的GC系统采用标记-清除算法,这类似于C#和Java的GC机制…

Libgdx游戏开发(3)——通过柏林噪音算法地图随机地形

原文: Libgdx游戏开发(3)——通过柏林噪音算法地图随机地形-Stars-One的杂货小窝 在B站刷到了随机地图生成的视频,随手学习下并做下记录注: 本篇使用javafx应用作演示,算是了解这个算法的使用,后续会再出篇libgdx生成地图的示例说明 抛开算法实现,首先认知柏林噪音算法 一般我们…

MyBatis 关于查询语句上配置的详细内容

1. MyBatis 关于查询语句上配置的详细内容 @目录1. MyBatis 关于查询语句上配置的详细内容2. 准备工作3. SQL查询结果,返回为POJO实体类型4. SQL查询结果,返回为List<POJO> 集合类型5. SQL查询结果,返回为Map 集合6. SQL查询结果,返回为List<Map>集合7. SQL查询…

PC端抓包-.exe程序

一、工具 Proxifier:https://files.cnblogs.com/files/blogs/679179/Proxifier-Lit.zip?t=1717655967&download=true+ Charles:https://www.charlesproxy.com二、配置 1、Charles配置 ➭ 勾选Windows Proxy ➭ 点击Proxy Settings,定义一个代理端口(默认8888) 2、Pr…

C# ComboBox 使用示例

效果图 form1.Designer.csprivate System.Windows.Forms.ComboBox cmbInstallResult;// // cmbInstallResult // this.cmbInstallResult.Cursor = System.Windows.Forms.Cursors.Hand; this.cmbInstallResult.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.cmbInst…

开源可视化表单可以用在哪些行业中?

针对客户的问题,我们今天一起来了解开源可视化表单可以应用的领域以及它都有哪些优势特点吧。很多客户朋友会询问我们,什么样的行业可以使用低代码技术平台及开源可视化表单?其实,随着社会的进步和发展,很多中小型企业都希望通过低代码技术平台能够让企业实现提质增效的目…