CAS Server Restful接口实现后台认证
背景
对于一些比较复杂定制化登录页的情况下,之前提到过可以自定义修改使用CAS Server提供的登录页这种操作已经明显跟不上复杂定制场景了,所以CAS Server也提供了支持Restful接口,支持服务端后台登陆,对于复杂登陆场景时,可以使用接口后台进行认证CAS Server。
引入
在CAS Server中,引入restful接口依赖包
<!-- rest --> <dependency><groupId>org.apereo.cas</groupId><artifactId>cas-server-support-rest</artifactId><version>6.5.9</version> </dependency>
重启CAS Server服务,在日志中能够看到如下日志:
说明restful接口已经成功引入了。
接口介绍
可以打开Spring MVC的扫描接口日志打印,可以看到有如下接口:
接口 | 参数说明 | 接口说明 |
---|---|---|
GET [/v1/tickets/{id:.+}] | 使用PathVariable接收参数,参数为ST票据。 | 用于校验ST票据状态 |
POST [/v1/tickets/{tgtId:.+}] | 使用PathVariable接收参数,参数为TGT;以及需要service作为表单参数使用application/x-www-form-urlencoded形式传递即可。 | 用于生成ST票据 |
POST [/v1/tickets] | 与CAS Server的UsernamePasswordCredential参数有关,默认为username和password参数,使用application/x-www-form-urlencoded形式传参。 | 获取TGT |
DELETE [/v1/tickets/{tgtId:.+}] | 使用PathVariable接收参数,参数为TGT。 | 删除TGT信息 |
GET [/v1/tickets] | 无。 | 不支持GET请求 |
POST [/v1/users] | 与CAS Server的UsernamePasswordCredential参数有关,默认为username和password参数,使用application/x-www-form-urlencoded形式传参。 | 获取当前CAS Server登陆的用户信息 |
后台认证示例
以Java语言作为示例,实现后台认证共分为三个步骤:
-
通过/v1/tickets接口获取到TGT信息
-
根据返回的TGT信息获取到ST票据
-
拼接ST票据重定向到指定接口即可完成认证
获取TGT信息
示例代码:
CloseableHttpClient httpClient = HttpClients.createDefault();String tgtUrl = null;try {//1.获取tgtHttpPost httpPost = new HttpPost(casServerUrlPrefix + "/v1/tickets");// 使用默认账号密码作为示例List<BasicNameValuePair> data = new LinkedList<>();data.add(new BasicNameValuePair("username", "casuser"));data.add(new BasicNameValuePair("password", "mellon"));HttpEntity httpEntity = new UrlEncodedFormEntity(data);httpPost.setEntity(httpEntity);CloseableHttpResponse execute = httpClient.execute(httpPost); HttpEntity entity = execute.getEntity();String s = EntityUtils.toString(entity);tgtUrl = HtmlUtil.getAction(s);EntityUtils.consume(entity);} catch (Exception e) {// do nothing}
由于该接口返回的TGT信息如下:
<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"> <html> <head><title>201 CREATED</title> </head> <body><h1>TGT Created</h1><formaction="http://localhost:8443/cas/v1/tickets/TGT-2-nx5h-5vzWsUzXBBNcY--WYT19d6FTuIQrv8G92Rx-3SCD2Gn3XWZbZMgFCUB4tzNYWg-DESKTOP-RV5J95A"method="POST">Service:<input type="text" name="service" value=""><br><input type="submit" value="Submit"></form> </body> </html>
所以需要从html中获取到action的TGT重定向信息,当前示例使用jsoup获取到TGT。
public class HtmlUtil {public static String getAction(String htmlContent) {Document parse = Jsoup.parse(htmlContent);Element body = parse.body();Elements form = body.getElementsByTag("form");Element element = form.get(0);return element.attr("action");} }
获取ST票据
示例代码:
String st = null;//2.获取STtry {HttpPost httpPost = new HttpPost(tgtUrl);List<BasicNameValuePair> data = new LinkedList<>();data.add(new BasicNameValuePair("service", serviceUrl));HttpEntity httpEntity = new UrlEncodedFormEntity(data);httpPost.setEntity(httpEntity);CloseableHttpResponse execute = httpClient.execute(httpPost);st = EntityUtils.toString(execute.getEntity());EntityUtils.consume(execute.getEntity());} catch (Exception e) {e.printStackTrace();}
需传递service重定向地址参数过去,该参数是用来绑定ST票据信息。
重定向地址
拿到ST票据信息之后,需拼接tickets={ST}参数并且页面重定向到上述serviceUrl接口,之前提到过解析ST时,或获取到重新向接口通过/p3/serviceValidate接口进行认证,如果重定向的接口并非service绑定的接口时,则CAS Server认证报错。
退出
使用CAS Server的页面登录,在退出的时候应该调用CAS Server的退出接口(/logout)。
在客户端服务中退出登陆,只要清除session即可;但是在清除客户端服务之后,再次访问客户端接口时,会跳转到CAS Server登录页面,但是由于CAS Server并没有退出,导致会直接重定向到访问客户端的接口,接口跳转如下:
图中,getData模拟客户端服务接口,由于CAS Server在登录的时候会写入Cookie,存在Cookie会导致重新登陆并且重定向回来。因此在客户端服务退出时,需调用CAS Server退出接口。
后台认证时,并未使用CAS Server登陆,如果重新访问CAS Server依旧是未登录状态,所以在退出的时候直接清除session即可。
相关文章:

CAS Server Restful接口实现后台认证
背景 对于一些比较复杂定制化登录页的情况下,之前提到过可以自定义修改使用CAS Server提供的登录页这种操作已经明显跟不上复杂定制场景了,所以CAS Server也提供了支持Restful接口,支持服务端后台登陆,对于复杂登陆场景时&#x…...

Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息
0 前言 在开展系统安全检查的过程中,除了收集cpu信息,我们还需要收集内存信息。在Linux中,获取内存信息的命令很多,这里我们着重研究 cat /proc/mem命令。 1 cat /proc/mem命令 /proc/meminfo 文件提供了有关系统内存的使用情况…...

【InternLM实战营第二期笔记】07:OpenCompass :是骡子是马,拉出来溜溜
文章目录 课程实操 课程 评测的意义是什么呢?我最近也在想。看到这节开头的内容后忽然有个顿悟:如果大模型最终也会变成一种基础工具(类比软件),稳定或可预期的效果需要先于用户感知构建出来,评测 case 就…...

matlab演示银河系转动动画
代码 function GalaxyRotationSimulation()% 参数设置num_stars 1000; % 恒星数量galaxy_radius 1; % 银河系半径rotation_speed 0.05; % 旋转速度% 生成银河系中的恒星分布theta 2 * pi * rand(num_stars, 1); % 角度r galaxy_radius * sqrt(rand(num_stars, 1)); % 半径…...

备战 清华大学 上机编程考试-冲刺前50%,倒数第5天
T1:多项式求和 小K最近刚刚习得了一种非常酷炫的多项式求和技巧,可以对某几类特殊的多项式进行运算。非常不幸的是,小K发现老师在布置作业时抄错了数据,导致一道题并不能用刚学的方法来解,于是希望你能帮忙写一个程序…...
leetCode127. 单词接龙
leetCode127. 单词接龙 // bfs 剪枝 class Solution { public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {// 1.将所有的单词放在set字段中unordered_set<string> s;for (auto & ele : wordList) s.insert(ele);//…...

进程概念(二)
目录 进程优先级基本概念查看系统进程PRI and NIPRI vs NI修改进程优先级的命令renice修改优先级进程其他概念 环境变量基本概念查看环境变量方法常见环境变量PATHHOMESHELL 查看环境变量环境变量相关的命令 环境变量特征命令行参数main函数中的俩个参数 argc argvmain函数的第…...
java程序100道01—20
1.用循环的嵌套,输出输出如下图形 * * * * * * * * * * * * * * * * * * * * * * * * * package Exercises.One_Hundred; public class Demo01 {public static void main(String[] args) {for(int i1;i<5;i){for(int j1;j<2*i-1;j){Sys…...
让GNSSRTK不再难【第二天-第7部分2】
状态更新计算过程: 计算卡尔曼增益: 根据预测的误差协方差矩阵 P k − P_k^- Pk− 和观测噪声协方差矩阵 R R R 计算卡尔曼增益 K k K_k Kk: K k P k − H T ( H P k − H T R ) − 1 K_k P_k^- H^T (H P_k^- H^T R)^{-1} KkPk…...
计算引擎:Flink核心概念
Apache Flink 是一个流处理框架,擅长处理实时数据流和批处理任务。Flink 提供了强大的功能来处理和分析大量数据。以下是 Flink 的核心概念: 1. DataStream 和 DataSet API DataStream API: 用于处理无界数据流,即不断生成和流动的数据。例如,传感器数据、日志等。DataSet…...

技术前沿 |【大模型InstructBLIP进行指令微调】
大模型InstructBLIP进行指令微调 一、引言二、InstructBLIP模型介绍三、指令微调训练通用视觉语言模型的应用潜力四、InstructBLIP的指令微调训练步骤五、实验结果与讨论六、结论与展望 一、引言 随着人工智能技术的快速发展,视觉语言模型(Vision-Langu…...
CSS-布局-flex
CSS3 新增了弹性盒子模型( Flexible Box 或 FlexBox ),是一种新的用于在 HTML 页面实现布局的方式。使得 HTML 页面适应不同尺寸的屏幕和不同的设备时,元素是可预测地运行。 基本概念 容器:使用 display:flex 或 display:inline-flex 声明的…...
「C系列」C 数组
文章目录 一、C 数组1. 声明数组2. 初始化数组3. 访问数组元素4. 数组越界5. 多维数组 二、C 操作数组的方法有哪些三、C 数组-应用场景1. 存储固定数量的数据2. 实现算法(如排序)3. 处理数据集合 四、相关链接 一、C 数组 在C语言中,数组是…...

Python框架scrapy有什么天赋异禀
Scrapy框架与一般的爬虫代码之间有几个显著的区别,这些差异主要体现在设计模式、代码结构、执行效率以及可扩展性等方面。下面是一些关键的不同点: 结构化与模块化: Scrapy:提供了高度结构化的框架,包括定义好的Spider…...

【ROS2大白话】四、ROS2非常简单的传参方式
系列文章目录 【ROS2大白话】一、ROS2 humble及cartorgrapher安装 【ROS2大白话】二、turtlebot3安装 【ROS2大白话】三、给turtlebot3安装realsense深度相机 【ROS2大白话】四、ROS2非常简单的传参方式 文章目录 系列文章目录前言一、launch文件传参的demo1. 编写launch.py文…...
浅谈mysql 的批量delete 和 使用in条件批量删除问题
在考虑这两个DELETE语句的性能时,我们需要考虑数据库如何执行这些查询以及它们背后可能涉及的索引和数据结构。 1.执行多个单独的DELETE语句: DELETE FROM a WHERE b 1 AND c 1; ... DELETE FROM a WHERE b 1000 AND c 1000; 这种方法的优点是每…...
【Spring Boot】过滤敏感词的两种实现
文章目录 项目场景前置知识前缀树 实现方式解决方案一:读取敏感词文件生成前缀树构建敏感词过滤器1. 导入敏感词文件 src/main/resources/sensitive_words.txt2. 构建敏感词过滤器 SensitiveFilter3. 测试与使用 解决方案二:使用第三方插件 houbb/sensit…...
在 Zustand 中管理状态能使用类(Class)吗
在 Zustand 中,通常不推荐使用类(Class)来管理状态,因为 Zustand 的设计理念是基于函数式编程和 React Hooks 的。然而,仍然可以在 Zustand 中间接地使用类,但这并不是 Zustand 的典型用法。 如果确实想要…...
MoreTable 方法selectWithFun,count 使用实例
ORM Bee, example for MoreTable methods:selectWithFun,count ORM Bee时, MoreTable 方法selectWithFun,count 使用实例 package org.teasoft.exam.bee.osql;import org.teasoft.bee.osql.BeeException; import org.teasoft.bee.osql.FunctionType; import org.teasoft.be…...
【SpringBoot】在Spring中使用自定义条件类在Java声明Bean时实现条件注入
在Spring框架中,通过实现org.springframework.context.annotation.Condition接口并重写matches()方法,可以根据自定义条件来控制Bean的注入。这种机制非常灵活,可以帮助开发人员根据环境或配置来有选择地启用或禁用某些Bean。本文将详细介绍如…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...