【CAS6.6源码解析】深度解析票据淘汰与过期策略-探究数据淘汰策略的设计

news2024/7/6 19:24:21

票据作为一种时效很敏感的数据,其过期策略的设计对其功能性和性能影响很大。本文将深度解析票据淘汰与过期策略,并基于此探究数据淘汰策略的设计,让我们一起走进企业级中央认证中心CAS的源码,分析其设计的巧妙之处。

文章重点分析源码的过程,不想看分析过程可以直接跳到总结处看结论!!!


文章目录

  • A.相关阅读
  • B.涉及源码作用及位置介绍
  • C.默认票据淘汰策略深入解析
    • 1.创建票据入口跟踪-过期策略从何而来
    • 2.默认Service的淘汰策略
    • 3.Service没有配置淘汰策略时如何构造
      • 3.1 TicketGrantingTicketExpirationPolicyBuilder
      • 3.2 解析参数构造存储策略
    • 4.何时触发淘汰
      • 4.1 getTicket时淘汰-延迟淘汰
      • 4.2 定时清理
  • D.总结
  • 参考


A.相关阅读

  • 【CAS6.6源码解析】在IDEA中调试可插拔的supprot模块
  • 【CAS6.6源码解析】调试Rest API接口
  • 【CAS6.6源码解析】深入解析TGT和ST的唯一ID是怎样生成的-探究ID生成器的设计
  • 【CAS6.6源码解析】深度解析默认票据存储策略及其拓展支持-探究存储策略的设计

B.涉及源码作用及位置介绍

票据淘汰策略相关的代码位于cas-server-core-tickets-api模块的ticket.expiration包下。

在这里插入图片描述

C.默认票据淘汰策略深入解析

我们先来看TGT的淘汰策略,ST的设计与TGT一致,但默认参数差异较大。

1.创建票据入口跟踪-过期策略从何而来

DefaultTicketGrantingTicketFactoryproduceTicket方法中可以看到,
在创建TGT票据之前,会先通过service去取到相应的淘汰策略。

在这里插入图片描述
继续看getTicketGrantingTicketExpirationPolicy函数:
在这里插入图片描述
这里直接获取了registeredService参数中的存储策略。registeredService是在Services Management中注册的服务,也就是预先配置好的服务配置。

从这里我们大致可以看出,票据的淘汰策略和registeredService是强关联的

2.默认Service的淘汰策略

接下来我们调试下源码,看一下系统里默认配置的Service,使用的是何种淘汰策略。

在这里插入图片描述

从这里我们可以看出,系统默认配置的Service中没有配置淘汰策略

3.Service没有配置淘汰策略时如何构造

从上面源码可以看到,当Service没有配置淘汰策略时,会通过ticketGrantingTicketExpirationPolicy.buildTicketExpirationPolicy();去构建一个票据淘汰策略。

3.1 TicketGrantingTicketExpirationPolicyBuilder

我们看一下配置类中这个ticketGrantingTicketExpirationPolicy的实现类,是TicketGrantingTicketExpirationPolicyBuilder,并且将配置的参数传递给了它。

在这里插入图片描述
我们再来分析一下TicketGrantingTicketExpirationPolicyBuilderbuildTicketExpirationPolicy()方法的实现逻辑:
在这里插入图片描述
这里的逻辑很简单,就是判断是不是开启了RememberMe,进入不同的解析配置的方法。

3.2 解析参数构造存储策略

toTicketGrantingTicketExpirationPolicy方法,大致浏览一下,发现主要是在依据配置判断返回何种淘汰策略实例。

我们看看是怎么解析这些配置的。

第一步:如果票据是设置的永不过期,那么将返回一个永不过期的实例。
在这里插入图片描述

如何判断永不过期,核心代码如下:(即-1、空值、INFINITE)

public static boolean isInfinitelyDurable(final String value) {
    return "-1".equalsIgnoreCase(value) || !StringUtils.hasText(value) || "INFINITE".equalsIgnoreCase(value);
}

第二步:如果票据是立即过期的,那么将返回一个立即过期的实例。
在这里插入图片描述
如何判断立即过期,核心代码如下:(即0、NEVER、空值)

public static boolean isNeverDurable(final String value) {
    return "0".equalsIgnoreCase(value) || "NEVER".equalsIgnoreCase(value) || !StringUtils.hasText(value);
}

注意,空值同时会被判为永不过期何立即过期,但是在或逻辑里面的顺序不同,所以可以通过控制工具方法的执行顺序来达到目的。

第三步:如果设置了超时配置(超过一段时间没有使用,即过期),那么优先返回超时配置。系统默认没有配置超时配置。
在这里插入图片描述

第四步:如果配置了门限超时配置(每多少毫秒只能使用一次,防止资源浪费),那么优先返回此配置,系统默认没有配置此配置。

在这里插入图片描述

第五步:如果配置了基于票据创建时间的硬超时配置,那么优先返回此配置,系统默认没有配置此配置。

在这里插入图片描述

如果上述步骤都未成功返回,那么获取经典配置,构造一个TicketGrantingTicketExpirationPolicy对象。

在这里插入图片描述

在配置文件中这两个参数的含义是:

  • maxTimePrimarySeconds:票据最大存活时间。默认是8小时。
  • ttlPrimarySeconds:超过多少时间后,票据不活跃将会被销毁。默认是2小时。

在这里插入图片描述
从这里我们可以看出,系统默认配置的TGT淘汰策略是经典策略(最多存活8小时,超过2小时未活跃则销毁),并可以拓展配置永不过期、立即过期、超时、门限超硬超时配置。

从上面可以总结,如果service没有配置淘汰策略,那么会从配置文件中取到默认的配置,是一个TicketGrantingTicketExpirationPolicy对象,然后传递给TicketGrantingTicketImpl用于实例化。

到这里,TGT的淘汰策略从而而来已经完全弄清楚了。

4.何时触发淘汰

在一个TGT对象创建的时候,淘汰策略已经被确定,接下来看是什么时候触发淘汰的。

4.1 getTicket时淘汰-延迟淘汰

在从TicketRegistry获取票据时,如果判断已经过期,那么将会删除这个票据,这是一种延迟淘汰机制。

那么是怎么判断票据是否过期的呢?核心代码如下:

@Override
public boolean isExpired() {
    return this.expirationPolicy.isExpired(this) || isExpiredInternal();
}

如果票据淘汰策略判断过期了或者内部判断过期了,就会返回已过期。其中,内部过期就是用户强制手动过期。

再细看一下淘汰策略里面是如何判断过期的,很简单,拿票据创建时间、上次使用时间和服务器系统时间进行一下比对即可。

在这里插入图片描述

4.2 定时清理

CAS默认会通过一个定时任务去清理一次所有过期的票据。其顶级接口如下:

在这里插入图片描述
看一下容器中注入的是何种实现类:

在这里插入图片描述

从这里可以发现,如果配置里配置了开启定时清理,就会注入一个DefaultTicketRegistryCleaner实例,如果没有开启,将不会注入可用的清理实例。系统默认是开启了票据定时清理的。

往下看,可以发现定时任务的注册:

在这里插入图片描述

系统默认延迟30s开启定时清理任务,每120s执行一次

看一下DefaultTicketRegistryCleaner的逻辑,其实也很简单:

在这里插入图片描述
首先获取到所有已经过期的票据,然后调用清理方法进行清理。在这里插入图片描述
如果清理的是TGT票据,同时会进行登出操作。

到这里,基本上淘汰策略的获取与淘汰操作的具体执行都弄清楚了,上述所讲都是基于默认配置,如果进行了其它拓展配置,新情况可能会有所出入。


D.总结

从CAS的默认淘汰策略的流程来说:

  • 淘汰策略优先从RegisteredService中取,如果相应的注册服务没有配置淘汰策略,才会使用配置文件中的淘汰策略。票据的淘汰策略和registeredService是强关联的。 系统默认注册的服务HTTPS and IMAPS,并没有配置淘汰策略。
  • 系统默认配置的TGT淘汰策略是经典策略(最多存活8小时,超过2小时未活跃则销毁),并可以拓展配置永不过期、立即过期、超时、门限超硬超时配置。
  • CAS对过期票据默认有两种淘汰操作:
    • 在获取票据时(getTicket)如果判断过期,则会立即删除。
    • 默认开启一个延迟30s启动,每隔120s执行一次的定时清理过期票据任务,如果清理的是TGT票据,还会同时触发登出操作。

从CAS的淘汰策略的设计来说:

  • 设计了淘汰策略,淘汰策略构造器,定时清理过期票据,将淘汰策略和服务强关联,并且有默认的淘汰策略配置,可拓展性极强。
  • 用于淘汰相关的参数,全部从配置文件中取,只需要简单的配置,即可完成强大的功能。

参考

截止2023-08-01为止,还没有专门分析CAS6源码的文章可检索,本文只参考了CAS6.6的源代码,所有分析过程均经过动态调试验证。


ATFWUS 2023-08-01

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

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

相关文章

二十三种设计模式第二十二篇--中介者模式

说到这个模式就有趣了,不知道大家在生活中喷到过中介没?其实中介这个词吧,我也说不上好还是坏,有时候他可以帮助人们更快的达到某个目的,但有的时候吧,这个有贼坑人,相信网络上有各种被中介坑的…

Redis场景应用:详细实现网站粉丝关注与展示的功能

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。多年电商行业从业经验,对系统架构,数据分析处理等大规模应用场景有丰富经验。 🏆本文…

嵌入式Linux下 i2c-tool工具的使用方法 包括i2cdetect、i2cget、i2cset、i2cdump、i2ctransfer

要想用Linux i2c-tools必须安装如下套件,安装后就可以使用i2cdetect、i2cdump、i2cset、i2cget、i2ctransfer了。 sudo apt install i2c-tools -yi2cdetect命令 该命令用于扫描I2C总线上的设备。 语法:i2cdetect [-y] [-a] [-q|-r] i2cbus [first las…

[论文笔记] chatgpt系列 2.6 DeepSpeed-chat 数据集

一、FT数据集 & Reward model数据集 Deepspeed-chat 源代码的数据集: Dahoas/rm-static: 这是一个用于强化学习的静态环境数据集,包含了一个机器人在一个固定环境中的运动轨迹。该数据集旨在用于评估强化学习算法在静态环境下的表现。 Dahoas/full-hh-rlhf: 这是一个用于…

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式,元素对象已接…

openGauss学习笔记-27 openGauss 高级数据管理- JOIN

文章目录 openGauss学习笔记-27 openGauss 高级数据管理- JOIN27.1 交叉连接27.2 内连接27.3 左外连接27.4 右外连接27.5 全外连接 openGauss学习笔记-27 openGauss 高级数据管理- JOIN JOIN子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。 在…

SLA探活工具EaseProbe

工具介绍 EaseProbe可以做三种工作:探测、通知和报告。 项目地址:https://github.com/megaease/easeprobe 1、安装 [rootlocalhost ]# yum -y install unzip go [rootlocalhost ]# unzip easeprobe-main.zip [rootlocalhost ]# cd easeprobe-main [r…

如祺出行冲刺自动驾驶商业化,人少的地方机会多?

网约车,正在迎来让人“不明觉厉”的新一轮竞赛。 网约车监管信息交互系统的数据显示,截至今年6月30日,全国共有318家网约车平台公司取得网约车平台经营许可,环比增加5家;网约车监管信息交互系统6月份共收到订单信息7.…

作为新手小白,你应该了解的五个3DMAX的使用干货小技巧!

3Dmax是一款著名的三维建模和动画制作软件,广泛应用于建筑设计、影视特效、游戏开发等领域。对于初学者来说,熟练掌握一些干货小技巧,可以帮助大家更快地上手和使用这款强大的软件。 一、学习基础操作技巧 首先,你需要学习一些基…

留存测试数据,Apipost接口用例详解

接口用例可以在不影响源接口数据的情况下对接口添加多个用例,方便测试并保存测试数据。 创建用例 左侧目录选择接口后进入接口用例页面,点击添加用例 在弹出窗口中修改各种参数。如登录接口,可修改用户名为空,并添加断言。 执行…

【phaser微信抖音小游戏开发006】给文本增加点击事件

新建st006,为文本增加点击事件。 我们加了一个计数的count,点击一次增加一下,并显示到屏幕上去。 效果如下图: 其它的对象以此类推即可,先置inputEnable为true,然后再增加一个inputDown事件即可。

IO进程线程day4(2023.8.1)

一、Xmind整理: 进程的五态图: 内存分布图: 注:栈区:存储局部变量,形参(上边打错了!!!) 虚拟内存和物理内存: 进程的STAT&#xff1a…

C++设计模式之装饰者模式

文章目录 C装饰者设计模式什么是装饰者模式优缺点优点缺点 如何使用 C装饰者设计模式 什么是装饰者模式 装饰者模式是一种设计模式,它允许我们动态地将行为附加到对象上,而无需改变对象本身的定义。它将一个对象的行为包装在一个独立的的对象中&#xf…

数据库事务--数据库事务隔离级别实战

2、演示环境 数据库及工具 ➢MySQL版本 5.5.47 ➢数据库工具 Navicat for MySQL 数据库命令 ➢查看数据库版本: select version();➢查看数据库现在的隔离级别: select session.tx_ isolation;➢修改隔离级别: set session.tx_ _isolation级别参数;➢级别参数: READ-UN…

内网横向移动—非约束委派约束委派

内网横向移动—非约束委派&约束委派 1. 委派攻击介绍1.1. 约束委派分类 2. 非约束委派2.1. 配置非约束委派2.1.1. 域内主机配置2.1.2. 注册对象2.1.3. 域内用户配置 2.2. 案例测试2.2.1. 查询服务账户2.2.2. 查询机器账户2.2.3. 机器通讯2.2.4. 导出票据2.2.5. 导入票据2.2…

算法题--二叉树(二叉树的最近公共祖先、重建二叉树、二叉搜索树的后序遍历序列)

目录 二叉树 题目 二叉树的最近公共祖先 原题链接 解析 二叉搜索树的最近公共节点 核心思想 答案 重建二叉树 题目链接 解析 核心思想 答案 二叉搜索树的后序遍历序列 原题链接 解析 核心思想 答案 二叉树 该类题目的解决一般是通过节点的遍历去实现&#x…

edge://settings/defaultbrowser default ie

Microsoft Edge 中的 Internet Explorer 模式 有些网站专为与 Internet Explorer 一起使用,它们具有 Microsoft Edge 等新式浏览器不支持的功能。 如果你需要查看其中的某个网站,可使用 Microsoft Edge 中的 Internet Explorer 模式。 大多数网站在新…

优先级队列 (堆)

目录 一,堆的概念 二, 堆的存储结构 三, 堆的实现 3.1 shiftDown() 3.2 shiftUp() 3.3 shiftDown 与 shiftUp 的时间复杂度 四,堆排序 一,堆的概念 堆常用于实现优先队列(Priority Queue&#xff0…

【算法训练营】求最小公倍数+另类加法+走方格的方案数

7月31日 求最小公倍数题目题解代码 另类加法题目题解代码 走方格的方案数题目题解| 1 | 2 | 3 || 4 | 5 | 6 || 7 | 8 | 9 |代码 求最小公倍数 题目 点击跳转: 求最小公倍数 题解 最小公倍数 两数之积除以最大公约数,这里使用碾转相除法进行最大公约数的求解&am…

学习盒模型

1.是什么 2.标准模型 3.怪异模型 一、是什么 一个盒子由四部分组成: content、padding、border、margin 在CSS中,盒子模型可以分成: W3C 标准盒子模型IE 怪异盒子模型 默认情况下,盒子模型为W3C标准盒模型 二、标准盒模型 盒子总…