前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CAS单点登录-动态添加services(七)

CAS单点登录-动态添加services(七)

作者头像
用户1212940
发布2022-04-13 16:51:06
9700
发布2022-04-13 16:51:06
举报
文章被收录于专栏:LambdaLambda

前面我们整合客户端的时候,需要在cas服务端注册,使用的是json文件的方式,直接通过配置文件完成配置,但是也存在一定的不方便性。 假如,我们以域名配置的,比如:http://app1.cas.com 注册,那么又有新的模块为 http://app2.cas.com 我们总不能每次修改配置,重启cas服务吧。这很不现实,官网给出了如下的解决方式,将数据库来存储这些数据。

具体参考官网 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添加依赖

代码语言:javascript
复制
<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添加以下属性

代码语言:javascript
复制
##
# 动态service 注册配置
#
#数据库用户名
cas.serviceRegistry.jpa.user=root
#数据库密码
cas.serviceRegistry.jpa.password=123456
#mysql驱动
cas.serviceRegistry.jpa.driverClass=com.mysql.jdbc.Driver
#数据库连接
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
#默认为create-drop,表示每次启动服务都会清除你之前注册的cas服务,生产环境生成表结构后需要修改配置为update
cas.serviceRegistry.jpa.ddlAuto=update

停止服务,将会删除之前创建的service

为了避免重启服务,导致之前的services丢失,需要将 cas.serviceRegistry.jpa.ddlAuto=update 每次启动之后,会在mysql中自动生成以下表格

11464886-607dccecf23b3150.png
11464886-607dccecf23b3150.png

增加http接口,操作数据库添加或删除service

代码语言:javascript
复制
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");
            //这个是为了单点登出而作用的
            service.setLogoutUrl(new URL("http://"+serviceId));
            servicesManager.save(service);
            //执行load让他生效
            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");
//            //这个是为了单点登出而作用的
//            service.setLogoutUrl(new URL("http://"+serviceId));
            String aa = "http://app2.cas.com:8082";
            RegisteredService service = servicesManager.findServiceBy(aa);
            servicesManager.delete(service);
            //执行load生效
            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集成

  • 第一种方式: 引入依赖包即可:
代码语言:javascript
复制
<dependency>
  <groupId>org.apereo.cas</groupId>
  <artifactId>cas-server-documentation-swagger</artifactId>
  <version>${cas.version}</version>
</dependency>

cas已经配置好swagger,启动即可使用

  • 第二种方式: 手动配置: 引入依赖:
代码语言:javascript
复制
<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配置类:

代码语言:javascript
复制
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

代码语言:javascript
复制
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.thtf.cas.config.CustomAuthenticationConfiguration,\
com.thtf.cas.config.CasSwaggerConfiguration,\
com.thtf.cas.controller.ServiceController

注意:如果不添加,这个两个类不会被系统识别

以下Swagger端点可用于分析和测试API:

描述

网址

Swagger API规范

http://localhost/cas/v2/api-docs

Swagger UI

http://localhost/cas/swagger-ui.html

启动

访问:http://localhost:8443/cas/swagger-ui.html

11464886-1b5d7664714716a3.png
11464886-1b5d7664714716a3.png

测试

  • 此时我们就可以通过接口完成service的添加,删除等操作
11464886-a57224dadc84940d.png
11464886-a57224dadc84940d.png
  • 查看数据库表
11464886-e638e5b3da372a16.png
11464886-e638e5b3da372a16.png

总结

此中方式可以更加方便管理service,而不用每次有新的应用接入时重启cas-server服务器。 而且后面我们可以通过操作regexregisterdservice表 完成对service的管理

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • pom添加依赖
  • application.properties添加以下属性
  • 停止服务,将会删除之前创建的service
  • 增加http接口,操作数据库添加或删除service
  • 配置集成SwaggerAPI集成
  • 启动
  • 测试
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档