当前位置: 首页 > news >正文

单点登录:cas单点登录实现原理浅析

cas单点登录实现原理浅析

一晃几个月没写博客了,今年多灾多难的一年。
安能摧眉折腰事权贵,使我不得开心颜!
财富是对认知的补偿,不是对勤奋的嘉奖。勤奋只能解决温饱,要挣到钱就得预知风口,或者有独到见解。
九十年代随便开个厂,随便造锅碗瓢盆就能挣到钱,这是人们生活变好对物质的逐渐增加。零几年的时候开个网吧,没日没夜挣钱,互联网兴起,人们开始追求精神需求。08年之前的房地产是朝阳产业,但凡贷款买几套房,后面卖出都能躺平下半生,这是城市化的风口。一几年的移动互联繁荣,催生了程序员等行业的快速发展,阿里京东等崭露头角,小米应运而生,这是科技的风口。现阶段看是流量为王,直播,短视频比较火。

一、基本流程介绍

CAS 包含两个部分: CAS Server 和 CAS Client
CAS-Server 需要独立部署,主要负责对用户的认证工作;
CAS-Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server

在这里插入图片描述

SSO单点登录访问流程步骤:

  1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

  2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。

  3. 用户认证:用户身份认证。

  4. 发放票据:SSO服务器会产生一个随机的Service Ticket。

  5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

  6. 传输用户信息: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)
STticket是一个随机字符串,登录成功后会存redis,key是ticket,value是包含TGC的对象

同时,把TGC存在浏览器中
WebUtil.setCookie(response, “TGC”, tgc, -1)
WebUtil.setCookie 是我们自己的往浏览器存cookie的方法
也可大致理解为:
{TGC:TGT} {ticket:TGC}

三、流程图

在这里插入图片描述

详解流程:

    1. 用户访问办公系统

用户访问http://oa.sinux.com,经过过滤器(默认OA系统已经引入了cas-client的客户端)cas-client-sdk.jar。
该sdk的核心是实现了Filter接口的拦截器
主要作用:判断是否登录,如果没有登录则重定向到认证中心

    1. 重定向到cas认证中心

cas拦截器发现既没有ticket也没有登录态,那就直接重定向到cas服务端。
返回的url是:http://cas.sinux.com?service=http%3A%2F%2Foa.sinux.com%2F
后端使用重定向,浏览器获取到的Status Code 是302
注:这里的serice后的地址会经过编码过,URLEncoder.encode

    1. 请求到cas服务端

服务端会去获取cookie是否有TGC,如果没有,会弹出登录页。如果有会校验TGC,正确的话直接颁发ticket

    1. cas返回登录页面

cas服务端会重定向到自己的登录页面(即 idaas的登录页)
请求地址:http://cas.sinux.com?service=http%3A%2F%2Foa.sinux.com%2F

    1. 输入账密登录
      用户输入账号密码
    1. 校验账密(核心)

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

    1. 浏览器发起重定向

浏览器收到302重定向到http://oa.sinux.com

    1. cas-client发起校验ticket

过滤器中会取到ticket的值,然后通过http方式调用http://cas.sinux.com验证该ticket是否是有效的

    1. cas服务端校验并返回

服务端根据ticket获取包含TGC的对象值,并删除ticket(一次有效),返回用户信息

    1. oa系统存储用户信息并返回资源

oa系统接收到cas服务端返回的用户信息,把用户信息存在session或redis,可以就是uuid,value就是用户信息。并往cookie存一个标识,用来保存uuid,例如:
CookieUtils.addCookie(response, “pa-ilf”, uuid, null, -1, false,false);
并通过拦截器的拦截,直接进入接口内容

    1. 用户再次访问OA系统

用户再次访问OA,因为cookie里有pa-if表示,可以拿到uuid,在拦截器里面可以拿到缓存的用户信息,直接通过拦截器进入接口

    1. 返回接口资源

返回接口信息

    1. 用户访问邮件系统

http://mail.sinux.com

    1. 邮箱系统发现第一次访问,拦截器拦截

邮箱系统(这里默认也对接了cas系统,即引入了cas-client包),发现无用户态无ticket,直接跳转到cas服务端地址(重定向)
http://cas.sinux.com?service=http%3A%2F%2Fmail.sinux.com%2F

    1. cas服务系统返回ticket

因为上面6.4已经在cookie缓存了一个TGC:uuid的结构,这里或直接拿到TGC的值即uuid,并取到用户信息。用户重新生成一个ticket,ticket与包含tgc的对象绑定 ,并把ticket拼接到url后面返回

    1. 返回浏览器

带ticket,并重定向 http://mail.sinux.com?ticket=dfgrtgaerwe

    1. 重定向回邮箱系统

浏览器收到302 http://mail.sinux.com?ticket=dfgrtgaerwe
拦截器发现没有登录态,回继续拦截

    1. 校验ticket(类似第8步)

cas-client发起http请求校验ticket的正确性

    1. 返回用户信息(类似第9步)

服务端根据ticket获取包含TGC的对象值,并删除ticket(一次有效),返回用户信息

    1. 缓存用户信息,并返回(类似第10步)

邮件系统接收到cas服务端返回的用户信息,把用户信息存在session或redis,可以就是uuid,value就是用户信息。并往cookie存一个标识,用来保存uuid,例如:
CookieUtils.addCookie(response, “pa-ilf”, uuid, null, -1, false,false);
并通过拦截器的拦截,直接进入接口内容

    1. 用户再次访问邮件系统

cas-client端会从cookie获取到pa-if对应的uuid,再根据uuid从缓存获取到用户信息, 那么久无需登录,直接进入接口

    1. 返回

返回接口资源

相关文章:

单点登录: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年首次亮相以来&#xff0c;Optuna不断发展&#xff0c;现已成为机器学习领域的重要工具。其用户社区持续壮大&#xff0c;目前已达到以下里程碑&#xff1a; 10,000 GitHub星标每月300万 下载量16,00…...

https和harbor仓库跟k8s

目录 https 做证书 harbor仓库 https https是加密的http&#xff0c;它的端口是443&#xff0c;它的协议是tcp协议。建立连接和普通的tcp是一样的&#xff0c;都是三次握手和四次挥手&#xff0c;但是它三次握手之后有一个步骤&#xff1a;SSL或者TLS握手的过程&#xff0c…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...