单点登录:cas单点登录实现原理浅析
cas单点登录实现原理浅析
一晃几个月没写博客了,今年多灾多难的一年。
安能摧眉折腰事权贵,使我不得开心颜!
财富是对认知的补偿,不是对勤奋的嘉奖。勤奋只能解决温饱,要挣到钱就得预知风口,或者有独到见解。
九十年代随便开个厂,随便造锅碗瓢盆就能挣到钱,这是人们生活变好对物质的逐渐增加。零几年的时候开个网吧,没日没夜挣钱,互联网兴起,人们开始追求精神需求。08年之前的房地产是朝阳产业,但凡贷款买几套房,后面卖出都能躺平下半生,这是城市化的风口。一几年的移动互联繁荣,催生了程序员等行业的快速发展,阿里京东等崭露头角,小米应运而生,这是科技的风口。现阶段看是流量为王,直播,短视频比较火。
一、基本流程介绍
CAS 包含两个部分:
CAS Server 和 CAS Client。
CAS-Server 需要独立部署,主要负责对用户的认证工作;
CAS-Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server

SSO单点登录访问流程步骤:
访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
定向认证:SSO客户端会重定向用户请求到SSO服务器。
用户认证:用户身份认证。
发放票据:SSO服务器会产生一个随机的Service Ticket。
验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
二、常用概念
TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他可以签发ST)
TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他可以找到TGT。
ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就生效了。也就ticket值
以我做过的一个经验为例:
TGC是一个随机字符串,Ids.uuid()。
TGT是包含用户信息的对象。 登录成功后,会保存redis,key就是TGC,value就是用户信息对象(可简称userInfo)
ST即ticket是一个随机字符串,登录成功后会存redis,key是ticket,value是包含TGC的对象同时,把TGC存在浏览器中
WebUtil.setCookie(response, “TGC”, tgc, -1)
WebUtil.setCookie 是我们自己的往浏览器存cookie的方法
也可大致理解为:
{TGC:TGT} {ticket:TGC}
三、流程图

详解流程:
-
- 用户访问办公系统
用户访问http://oa.sinux.com,经过过滤器(默认OA系统已经引入了cas-client的客户端)cas-client-sdk.jar。
该sdk的核心是实现了Filter接口的拦截器
主要作用:判断是否登录,如果没有登录则重定向到认证中心
-
- 重定向到cas认证中心
cas拦截器发现既没有ticket也没有登录态,那就直接
重定向到cas服务端。
返回的url是:http://cas.sinux.com?service=http%3A%2F%2Foa.sinux.com%2F
后端使用重定向,浏览器获取到的Status Code 是302
注:这里的serice后的地址会经过编码过,URLEncoder.encode
-
- 请求到cas服务端
服务端会去获取cookie是否有TGC,如果没有,会弹出登录页。如果有会校验TGC,正确的话直接颁发ticket
-
- cas返回登录页面
cas服务端会重定向到自己的登录页面(即 idaas的登录页)
请求地址:http://cas.sinux.com?service=http%3A%2F%2Foa.sinux.com%2F
-
- 输入账密登录
用户输入账号密码
- 输入账密登录
-
- 校验账密(核心)
6.1 输入账密后会访问cas服务端的认证接口,例如/cas/login
http://cas.sinux.com/cas/login?service=http%3A%2F%2Foa.sinux.com%2F参数就是输入的账号密码6.2 校验账密 - 校验逻辑不赘述
6.3 从cookie再去取一次TGC,再看看缓存是否存有以TGC为key的TGT的值,不存在则生成一个随机字符串作TGC,TGT则则包含了用户信息的对象,并缓存到redis
6.4 把TGC的值缓存到cookie,key就是TGC,value就是刚生成的随机字符串tgc
WebUtil.setCookie(response,“TGC”, tgc, -1);6.5 生成一个随机字符串作为ticket,并把ticket作为key,包含TGC的对象作为value缓存到redis
6.6 重定向service地址,并带上ticket 例如:http://oa.sinux.com?ticket=uaxdtejakj
-
- 浏览器发起重定向
浏览器收到302重定向到http://oa.sinux.com
-
- cas-client发起校验ticket
过滤器中会取到ticket的值,然后通过http方式调用http://cas.sinux.com验证该ticket是否是有效的
-
- cas服务端校验并返回
服务端根据ticket获取包含TGC的对象值,并删除ticket(一次有效),返回用户信息
-
- oa系统存储用户信息并返回资源
oa系统接收到cas服务端返回的用户信息,把用户信息存在session或redis,可以就是uuid,value就是用户信息。并往cookie存一个标识,用来保存uuid,例如:
CookieUtils.addCookie(response, “pa-ilf”, uuid, null, -1, false,false);
并通过拦截器的拦截,直接进入接口内容
-
- 用户再次访问OA系统
用户再次访问OA,因为cookie里有pa-if表示,可以拿到uuid,在拦截器里面可以拿到缓存的用户信息,直接通过拦截器进入接口
-
- 返回接口资源
返回接口信息
-
- 用户访问邮件系统
http://mail.sinux.com
-
- 邮箱系统发现第一次访问,拦截器拦截
邮箱系统(这里默认也对接了cas系统,即引入了cas-client包),发现无用户态无ticket,直接跳转到cas服务端地址(重定向)
http://cas.sinux.com?service=http%3A%2F%2Fmail.sinux.com%2F
-
- cas服务系统返回ticket
因为上面6.4已经在cookie缓存了一个TGC:uuid的结构,这里或直接拿到TGC的值即uuid,并取到用户信息。用户重新生成一个ticket,ticket与包含tgc的对象绑定 ,并把ticket拼接到url后面返回
-
- 返回浏览器
带ticket,并重定向
http://mail.sinux.com?ticket=dfgrtgaerwe
-
- 重定向回邮箱系统
浏览器收到302
http://mail.sinux.com?ticket=dfgrtgaerwe
拦截器发现没有登录态,回继续拦截
-
- 校验ticket(类似第8步)
cas-client发起http请求校验ticket的正确性
-
- 返回用户信息(类似第9步)
服务端根据ticket获取包含TGC的对象值,并删除ticket(一次有效),返回用户信息
-
- 缓存用户信息,并返回(类似第10步)
邮件系统接收到cas服务端返回的用户信息,把用户信息存在session或redis,可以就是uuid,value就是用户信息。并往cookie存一个标识,用来保存uuid,例如:
CookieUtils.addCookie(response, “pa-ilf”, uuid, null, -1, false,false);
并通过拦截器的拦截,直接进入接口内容
-
- 用户再次访问邮件系统
cas-client端会从cookie获取到pa-if对应的uuid,再根据uuid从缓存获取到用户信息, 那么久无需登录,直接进入接口
-
- 返回
返回接口资源
相关文章:
单点登录:cas单点登录实现原理浅析
cas单点登录实现原理浅析 一晃几个月没写博客了,今年多灾多难的一年。 安能摧眉折腰事权贵,使我不得开心颜! 财富是对认知的补偿,不是对勤奋的嘉奖。勤奋只能解决温饱,要挣到钱就得预知风口,或者有独到见解…...
java报错
java.lang.RuntimeException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.tengzhi.base.model.E_xt_xmda...
uniapp动态页面API
目录 uni.setNavigationBarTitle动态设置标题 uni.showNavigationBarLoading为标题添加加载动画与uni.hideNavigationBarLoading停止加载动画 编辑 uni.setNavigationBarColor用于设置导航栏的颜色,包括背景颜色和文字颜色。这对于自定义应用的主题和风格非常有…...
最优化方法Python计算:求解约束优化问题的拉格朗日乘子算法
从仅有等式约束的问题入手。设优化问题(7.8) { minimize f ( x ) s.t. h ( x ) o ( 1 ) \begin{cases} \text{minimize}\quad\quad f(\boldsymbol{x})\\ \text{s.t.}\quad\quad\quad \boldsymbol{h}(\boldsymbol{x})\boldsymbol{o} \end{cases}\quad\quad(1) {minimizef(x)s.…...
每日OJ_牛客_骆驼命名法(递归深搜)
目录 牛客_骆驼命名法(简单模拟) 解析代码 牛客_骆驼命名法(简单模拟) 骆驼命名法__牛客网 解析代码 首先一个字符一个字符的读取内容: 遇到 _ 就直接跳过。如果上一个字符是 _ 则下一个字符转大写字母。 #inclu…...
MySQL 数据库管理与操作指南
文章目录 MySQL 数据库管理与操作指南1. 忘记 MySQL 密码的处理方法2. MySQL 数据库备份与恢复2.1 数据库备份2.2 数据库恢复 3. MySQL 用户与权限管理3.1 创建用户与授权3.2 查看所有用户3.3 删除用户 4. 关闭 GTID 复制模式5. 查看数据表的存储引擎5.1 查看 MySQL 支持的存储…...
Android Manifest 权限描述大全对照表
115工具网(115工具网-一个提供高效、实用、方便的在线工具集合网站)提供Android Manifest 权限描述大全对照表,可以方便andriod开发者查看安卓权限描述功能 权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入…...
Ollama Qwen2 支持 Function Calling
默认 Ollama 中的 Qwen2 模型不支持 Function Calling,使用默认 Qwen2,Ollama 会报错。本文将根据官方模板对 ChatTemplate 进行改进,使得Qwen2 支持 Tools,支持函数调用。 Ollama 会检查对话模板中是否存在 Tools,如…...
APP测试工程师岗位面试题
一、你们公司研发团队采用敏捷开发模式的原因? 由于版本节奏比较快,开发与测试几乎并行,一个版本周期内会有两版在推动,也就是波次发布,波次发布用于尝试新加入的功能,做小范围快速的开发,验证…...
如何进行 AWS 云监控
什么是 AWS? Amazon Web Services(AWS)是 Amazon 提供的一个全面、广泛使用的云计算平台。它提供广泛的云服务,包括计算能力、存储选项、网络功能、数据库、分析、机器学习、人工智能、物联网和安全。 使用 AWS 有哪些好处&…...
第十六篇:走入计算机网络的传输层--传输层概述
1. 传输层的功能 ① 分割与重组数据 一次数据传输有大小限制,传输层需要做数据分割,所以在数据送达后必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机,无法判断数据报文应该交给哪个应用,传输层给每个应用都设…...
提升效率!ArcGIS中创建脚本工具
在我们日常使用的ArcGIS中已经自带了很多功能强大的工具,但有时候遇到个人的特殊情况还是无法满足,这时就可以试着创建自定义脚本工具。 一、编写代码 此处的代码就是一个很简单的给图层更改别名的代码。 1. import arcpy 2. input_fc arcpy.GetParam…...
无人机之报警器的作用
一、紧急救援与辅助搜救 紧急救援:在事故或紧急情况下,无人机报警器可以迅速发出警报,指引救援人员前往事故地点,提高救援效率。 辅助搜救:无人机搭载报警器可以辅助寻找失踪人员或其他需要搜救的场景,通…...
风格控制水平创新高!南理工InstantX小红书发布CSGO:简单高效的端到端风格迁移框架
论文链接:https://arxiv.org/pdf/2408.16766 项目链接:https://csgo-gen.github.io/ 亮点直击 构建了一个专门用于风格迁移的数据集设计了一个简单但有效的端到端训练的风格迁移框架CSGO框架,以验证这个大规模数据集在风格迁移中的有益效果。…...
python文件自动化(4)
接上节课内容,在开始正式移动文件到目标文件夹之前,我们需要再思考一个问题。在代码运行之前,阿文的下载文件夹里已经存在一些分类文件夹了,比如图例中“PDF文件”这个文件夹就是已经存在的。这样的话,在程序运行时&am…...
HTTP 方法
HTTP 方法 1. 引言 HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的协议之一。它定义了客户端和服务器之间交换信息的格式和规则。在HTTP通信中,客户端(通常是浏览器)向服务器…...
通过redis-operator 来部署 Redis Cluster 集群
安装 Redis Operator 首先,需要安装 redis-operator。可以通过 Helm 或直接应用 YAML 文件来安装。 使用 Helm 安装: helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/ helm install redis-operator ot-helm/redis-operator --…...
vue3集成sql语句编辑器
使用的是codemirror 安装 pnpm add codemirror vue-codemirror --savepnpm add codemirror/lang-sqlpnpm add codemirror/theme-one-dark使用 <template><codemirror v-model"configSql" placeholder"Code goes here..." ref"codemirrorR…...
Optuna发布 4.0 重大更新:多目标TPESampler自动化超参数优化速度提升显著
Optuna这个备受欢迎的超参数优化框架在近期发布了其第四个主要版本。自2018年首次亮相以来,Optuna不断发展,现已成为机器学习领域的重要工具。其用户社区持续壮大,目前已达到以下里程碑: 10,000 GitHub星标每月300万 下载量16,00…...
https和harbor仓库跟k8s
目录 https 做证书 harbor仓库 https https是加密的http,它的端口是443,它的协议是tcp协议。建立连接和普通的tcp是一样的,都是三次握手和四次挥手,但是它三次握手之后有一个步骤:SSL或者TLS握手的过程,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
