CAS5.2x单点登录(六)-----动态添加services

前面我们已经讲了cas的service服务的构造以及每个字段的意思,以及如何使用,但是我们之前讲的是静态的,也就是说所有的配置文件都写好了之后才去启动cas,但是这个在现实的场景是不存在的,为什么呢?


我们不可能每次新增一个cas客户端的时候就去停掉cas服务器,然后写配置文件,在重启。这样会导致好多系统用不了,最后没有人会使用cas,我们能想到的别人开发这个的也早已经想到了,所以就有了我本次所讲的动态添加service,但是我本次讲的动态添加不是基于json配置文件的。因为操作json问价的话就要涉及到文件流之类的,会让代码增加更多,其次性能上面也会有影响,那么我们是使用什么方式呢,答案就是jpa数据库来存储这些数据,使用jpa来存储这些数据,动态增加删除就变得相对于简单了。我们能使用jpa来操作得益于cas的支持,那么我们应该怎么去操作呢。先去pom文件里配置一个jar包

<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-jpa-service-registry</artifactId>
    <version>${cas.version}</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

  1. 首先我们必须要去连接数据库,这个可以在application配置文件中去配置,如图 
    这里写图片描述

  2. 这边我就讲解一下这里面比较重要的属性吧,比如cas.ticket.registry.jpa.url表示的是数据库的地址,cas.serviceRegistry.jpa.driverClass=com.mysql.cj.jdbc.Driver mysql的驱动,还有一个user和密码,这些都是很重要的属性,也是大家最熟悉不过的熟悉。

  3. cas.serviceRegistry.jpa.ddlAuto这个属性大概应该很陌生吧,他有几种选择一种是create,create表示的是每次重启后表的数据就会被清空,相当于你每次重启cas服务器之后,你之前注册的cas服务都会被清空。还有一个是update值,他的作用是什么呢,他的作用是不会被清空,就是你每次重启之后,你之前的服务还是在里面的。如果你使用这个的话,你最好在动态注册的时候判断一下这个是否存在,以免每一次注册都会冲突。
  4. cas.serviceRegistry.jpa.pool这个属性就是相当于连接池一样的东西,这个和java的数据库连接池很相像,就不多介绍了。 
    5.属性大致就这写比较重要的,其他的可以直接参照cas上面的配置这里写链接内容 
    我的配置大致如下图这里写图片描述

好了这个数据库配置好了,这时候我们要怎么去写这个动态的去添加我们的服务了,这时候就要去撸代码了,因为我们现在使用的都是restful风格的api接口,而巧合的是cas也支持这种,那么就简单的多了。我们动态添加的时候要导入这个类,我们直接将他注入进来

  @Autowired
      @Qualifier("servicesManager")
      private ServicesManager servicesManager;
      这个是管理我们所有服务的类
  • 1
  • 2
  • 3
  • 4

这个注入成功后就可以直接使用下面的代码进行注入

@RequestMapping(value = "/addClient/{serviceId}/{id}",method = RequestMethod.GET) 
      public String addClient(@PathVariable("serviceId") String serviceId,@PathVariable("id") int id) throws IOException {
          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);
          servicesManager.load();
          return "success";
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

看到上面的代码是不是感觉很亲切呢?因为我们之前的json文件其实也是这样的类型,只是我们这边直接使用代码来完成之前配置文件的功能,我还是一一解释一下,这个代码里面的东西吧,

  • RegexRegisteredService,这个代表的是注册服务的类,相当于我们之前的json中的@classs
  • ReturnAllAttributeReleasePolicy这个代表的是返回属性的,我们这边给他返回的是所有属性。ps(之后整合cas客户端的时候就知道这个属性的重要性了)
  • 还有就是id、name、serverId都是和之前的json一样,这些set进去后,就要去执行save,这个就相当于保存到数据库里面的作用,因为我们一旦设置是使用数据库存储的时候,启动cas服务器的时候会默认生成几张表,如下:这里写图片描述
  • 然后执行load让他立即生效,记住之前配置文件的这两个配置对数据库还是生效的,只是将jsnon文件换成数据库了cas.serviceRegistry.schedule.repeatInterval=120000 
    cas.serviceRegistry.schedule.startDelay=15000 
    到这里我们就将我们的动态添加的搞定了,既然有添加的就有删除的,我们就试一下如何去删除这些。

动态删除服务

动态删除服务其实也是通过服务管理类来完成的,

 RegisteredService svc = servicesManager.findServiceBy(serviceid);
    servicesManager.delete(svc);
  • 1
  • 2
  • 我们首先通过serviceid去查找是否存在这个服务,存在就去删除他。这个serviceid在我们这边表示的是匹配的url。
  • findServiceBy里面可以传这些东西,如图这里写图片描述
  • 至此我们也已经将cas的动态增加删除服务的也都已经讲完了,最后记住去spring.factories配置一下你类的全路径
  • 记住这边有个坑就是cas好像不支持多种方式一起来设置服务,相当于如果我们同时设置json和数据库两种方式的话,那么只有一种方式有用

猜你喜欢

转载自blog.csdn.net/gdsgdh308227363/article/details/80445586