CAS Server Restful接口实现后台认证

news2024/12/25 15:14:25

背景

对于一些比较复杂定制化登录页的情况下,之前提到过可以自定义修改使用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.获取tgt
            HttpPost 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>
    <form
        action="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.获取ST
        try {
            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即可。

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

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

相关文章

vscode 访问容器的方式

方法一&#xff1a;先连服务器&#xff0c;再转入容器 配置客户机A M1. 客户机A通过 vscode 连接服务器B&#xff0c;再连接容器C 配置vscode的ssh配置文件&#xff1a;~.ssh\config&#xff08;当需要多个不同的连接时&#xff0c;使用 IdentityFile 指定公钥位置&#xff09;…

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…

280 基于matlab的摇号系统GUI界面仿真MATLAB程序

基于matlab的摇号系统GUI界面仿真MATLAB程序&#xff0c;输入总数量及摇号需求&#xff0c;进行随机性摇号&#xff0c;并对摇取的号码进行双重随机性数据检测&#xff0c;确定是否符合要求。程序已调通&#xff0c;可直接运行。 280 GUI人机交互 摇号系统GUI界面仿真 - 小红书…

本地搭建支持语音和文本的中英文翻译服务-含全部源代码

实现目标 1、支持文本中英文互译&#xff1b; 2、支持中文语音输入&#xff1b; 3、支持英文语言输入&#xff1b; 进阶&#xff08;未实现&#xff09; 4、优化web界面&#xff1b; 5、优化语音输入js实现逻辑&#xff1b; 6、增加语音输入自纠错模型&#xff0c;纠正语音识别…

【PR2019】怎样批量添加转场效果及修改默认持续时间

一&#xff0c;设置“交叉溶解”效果到所有素材 选择效果&#xff0c;右击“将所选过渡设置为默认过渡”&#xff1a; 框选所有素材&#xff0c;“Ctrl D”&#xff1a; 每个素材中间有有了交叉溶解的效果&#xff1a; 二&#xff0c;修改效果属性 2.1&#xff0c;单个修…

从零开始,手把手教你文旅产业策划全攻略

如果你想深入了解文旅策划的世界&#xff0c;那么有很多途径可以获取知识和灵感。 首先&#xff0c;阅读一些专业书籍也是一个不错的选择。书店或图书馆里有许多关于文旅策划的书籍&#xff0c;它们通常涵盖了策划的基本理论、方法和实践案例。通过阅读这些书籍&#xff0c;你…

激光点云配准算法——Cofinet / GeoTransforme / MAC

激光点云配准算法——Cofinet / GeoTransformer / MAC GeoTransformer MAC是当前最SOTA的点云匹配算法&#xff0c;在之前我用总结过视觉特征匹配的相关算法 视觉SLAM总结——SuperPoint / SuperGlue 本篇博客对Cofinet、GeoTransformer、MAC三篇论文进行简单总结 1. Cofine…

热题系列章节5

169. 多数元素 给定一个大小为 n 的数组&#xff0c;找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出:…

【C语言】11.字符函数和字符串函数

文章目录 1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strcmp的使用和模拟实现7.strncpy函数的使用8.strncat函数的使用9.strncmp函数的使用10.strstr的使用和模拟实现11.strtok函数的使用12.strerror函数的使用 …

【MySQL】聊聊唯一索引是如何加锁的

首先我们要明确&#xff0c;加锁的对象是索引&#xff0c;加锁的基本单位是next-key lock&#xff0c;由记录锁和间隙锁组成。next-key是前开后闭区间&#xff0c;间隙锁是前开后开区间。根据不同的查询条件next-key 可能会退化成记录锁或间隙锁。 在能使用记录锁或者间隙锁就…

认识Spring中的BeanFactoryPostProcessor

先看下AI的介绍 在Spring 5.3.x中&#xff0c;BeanFactoryPostProcessor是一个重要的接口&#xff0c;用于在Spring IoC容器实例化任何bean之前&#xff0c;读取bean的定义&#xff08;配置元数据&#xff09;&#xff0c;并可能对其进行修改。以下是关于BeanFactoryPostProce…

31-捕获异常(NoSuchElementException)

在定位元素的时候&#xff0c;经常会遇到各种异常&#xff0c;遇到异常又该如何处理呢&#xff1f;本篇通过学习selenium的exceptions模块&#xff0c;了解异常发生的原因。 一、发生异常 打开百度搜索首页&#xff0c;定位搜索框&#xff0c;此元素id"kw"。为了故意…

定个小目标之刷LeetCode热题(15)

这道题直接就采用两数相加的规则&#xff0c;维护一个进阶值&#xff08;n&#xff09;即可&#xff0c;代码如下 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {// 新建一个值为0的头结点ListNode newHead new ListNode(0);// 创建几个指针用于…

央视频官方出品,AI高考智友助你成就高考梦想

大家好&#xff0c;我是小麦。今天分享一款由央视频官方出品的AI工具套件&#xff0c;不仅支持直接使用&#xff0c;同时还具备了开发能力&#xff0c;是一款非常不错的AI产品工具&#xff0c;该软件的名称叫做扣子。 扣子是新一代 AI 应用开发平台。无论你是否有编程基础&…

Python图像处理入门学习——基于霍夫变换的车道线和路沿检测

文章目录 前言一、实验内容与方法二、视频的导入、拆分、合成2.1 视频时长读取2.2 视频的拆分2.3 视频的合成 三、路沿检测3.1 路沿检测算法整体框架3.2 尝试3.3 图像处理->边缘检测(原理)3.4 Canny算子边缘检测(原理)3.5 Canny算子边缘检测(实现)3.5.1 高斯滤波3.5.2 图像转…

网络学习(二)DNS域名解析原理、DNS记录

目录 一、为什么要使用DNS&#xff1f;二、因特网的域名结构三、DNS域名解析原理【含详细图解】四、DNS记录&#xff08;A记录、AAAA记录、CNAME记录等&#xff09; 一、为什么要使用DNS&#xff1f; 我们知道&#xff0c;TCP/IP 协议中是使用 IP 地址和端口号来确定网络上的某…

Unity 设置默认字体(支持老版及新版TMP)

普通UI-Text设置 &#xff08;同一unity版本设置一次即可&#xff09; 1.首先工程的Resources目录下创建Fonts文件夹用于存放字体 如下图所示 2.找到Unity的安装目录下的Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\UI\Core\Text.cs文件 …

msfconsole利用Windows server2008cve-2019-0708漏洞入侵

一、环境搭建 Windows系列cve-2019-0708漏洞存在于Windows系统的Remote Desktop Services&#xff08;远程桌面服务&#xff09;&#xff08;端口3389&#xff09;中&#xff0c;未经身份验证的攻击者可以通过发送特殊构造的数据包触发漏洞&#xff0c;可能导致远程无需用户验…

C语言之main函数的返回值(在linux中执行shell脚本并且获取返回值)

一&#xff1a;函数为什么要返回值 &#xff08;1&#xff09;函数 在设计的时候是设计了参数和返回值&#xff0c;参数是函数的输入&#xff0c;返回值是函数的输出 &#xff08;2&#xff09;因为函数需要对外输出数据&#xff08;实际上是函数运行的一些结果值&#xff09;…

「51媒体」江苏媒体宣传报道,邀请媒体报道资源汇总

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 江苏作为中国东部的重要省份&#xff0c;拥有丰富的媒体资源&#xff0c;包括电视台、广播电台、报纸以及网络媒体。 电视台 江苏卫视&#xff1a;作为江苏省唯一的省级卫视台&#xff…