CAS 实现单点登录(SSO)原理

article/2025/9/4 2:52:34

原地址:https://blog.csdn.net/hejingyuan6/article/details/44277023
一、概念:
    单点登录(Single Sign On):简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
    CAS(Central Authentication Service):中央认证服务。CAS(Central Authentication Service)是一款不错的针对 Web应用的单点登录框架。
讲解CAS之前先来学习两个基本术语
二、术语解释:
1、TGC:Ticket-granting cookie,存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证。TGT封装了TGC值以及此Cookie值对应的用户信息。
2、TGT:ticket granting ticket,TGT对象的ID就是TGC的值,在服务器端,通过TGC查询TGT。
3、ST:service ticket,CAS为用户签发的访问某一service的票据,ST是TGT签发的。
4、PGT:proxy granting ticket,代理模式下的TGT
5、PT:proxy ticket,代理模式下的ST
6、service:在cas系统中,接入的各个子系统叫服务。因为对普通用户来说,每一个接入到cas认证中心的子系统都提供特定的服务比如商城、bbs等,大家都听过软件即服务,平台即服务,这样理解service就通顺了
SaaS:Software-as-a-Service,软件即服务
PaaS:Platform as a Service,平台即服务
7、credentials,凭证,即待认证的用户的信息载体,如用户名+密码
8、Principal,当事人,即认证之后返回的已认证的当事人的信息载体,默认只返回用户ID即用户名。
9、Authentication表示一个完成的认证请求,当然,结果可能是凭证有效或无效,他有一个method可以获取
三、深入CAS
    从结构上看,CAS包含两个部分:
    CAS Server:CASServer 负责完成对用户的认证工作 , 需要独立部署 , CAS Server 会处理用户名 /密码等凭证 (Credentials) 。
    CAS Client:负责处理对客户端受保护资源的访问请求,需要对请求方进行身份认证时,重定向到 CAS Server 进行认证。(原则上,客户端应用不再接受任何的用户名密码等 Credentials )。
    CASClient 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。
    CAS最基本的协议过程:
在这里插入图片描述
    CAS Client 与受保护的客户端应用部署在一起,以Filter方式保护 Web应用的受保护资源,过滤从客户端过来的每一个 Web 请求
    步骤详解:
    (step 1)Web浏览器访问CAS Client,无session并且无票据(ST),定向到CASServer
    (step 2)又因为浏览器中并没有cookie,故服务端拿不到TGC,因此需要重新登录
    (Step 3)是用户认证过程,如果用户提供了正确的CAS Server 会处理用户名 / 密码等凭证 (Credentials) ,认证成功后,CAS生成cookie(叫TGC),写入浏览器,同时生成一个TGT对象,再根据TGT发放票据ST,并且重定向用户到CAS Client(附带刚才产生的ServiceTicket), Service Ticket 是不可以伪造
    (step4)注:ST前半部分为登录url,后半部分为我客户端要访问的页面地址,只有当登录成功才会直接转向客户端访问的页面
    (Step 5)拿着ST去 CAS Server验证一下,验证成功返回用户信息(step6)
    注:收到ST后,为什么还要验证呢?
    因为CAS知道这个用户已经登录过了,但是对于这个项目来说,我并不知道这个用户已经登录过了,故需要验证
    当用户访问另一个应用的服务再次被重定向到 CAS Server 的时候, CAS Server 会主动获到这个 TGC cookie ,然后做下面的事情:
    1)如果 User 持有 TGC 且其还没失效,那么就走基础协议图的 Step4 ,达到了 SSO 的效果;
    2)如果 TGC 失效,那么用户还是要重新认证 ( 走基础协议图的 Step3) 。
CAS 请求认证时序图如下:
在这里插入图片描述
    1. CAS服务端登录时处理:
    第一步:cas往浏览器增加cookie(TGC)
    CAS向浏览器送回一个所谓的“内存cookie”。这种cookie并不是真的保存在内存中,而只是浏览器一关闭,cookie就自动过期。这个cookie称为“ticket-grantingcookie”,用来表明用户已经成功地登录。
    这个Cookie是一个加密的Cookie,其中保存了用户登录的信息。用于以后其它应用客户端登录。
    第二步:cas同时创建一个ticket(ST)重定向到原来的cas客户端。
    认证成功后,CAS服务器创建一个很长的、随机生成的字符串,称为“Ticket”。随后,CAS将这个ticket和成功登录的用户,以及服务联系在一起。这个ticket是一次性使用的一种凭证,它只对登录成功的用户及其服务使用一次。使用过以后立刻失效。
    2. CAS 客户端应用A的处理
    第一步:收到ticket后,向cas提交验证ticket。
    第二步:ticket验证后创建session
    以后登录此应用时,没有ticket,但IE。能提供session,从session中取得CASReceipt,并验证如果有效说明已经在此应用认证过,允许访问此应用。
    到此为止,CAS会记录用户已在应用A已经登录。
    3. 用户登录到应用B是如何处理
    用户进入应用B时,首先仍然会重定向到CAS服务器。不过此时CAS服务器不再要求用户输入用户名和密码,而是首先自动寻找Cookie,根据Cookie中保存的信息,进行登录。然后,CAS同样给出新的ticket重定向应用B给cas验证(流程同应用A验证方式),如果验证成功则应用B创建session记录CASReceipt信息到session中,以后凭此session登录应用B。
    原理:1个cookie+N个session
    CAS创建cookie在所有应用中登录时cas使用,各应用通过在IE创建各自的session来标识应用是否已经登录。
    Cookie:在cas为各应用登录时使用,实现了只须一次录入用户密码
    Session:各应用会创建自己的session表示是否登录
    具体描述一下客户端消息流程
    1.第一次访问http://localhost:8080/a,
    CLIENT:没票据且SESSION中没有消息所以跳转至CAS
    CAS:拿不到TGC故要求用户登录
    2. 认证成功后回跳
    CAS:通过TGT生成ST发给客户端,客户端保存TGC,并重定向到http://localhost:8080/a
    CLIENT:带有票据(ST)所以不跳转只是后台发给CAS验证票据(浏览器中无法看到这一过程)
    3.第一次访问http://localhost:8080/b
    CLIENT:没票据且SESSION中没有消息所以跳转至CAS
    CAS:从客户端取出TGC,如果TGC有效则给用户ST并后台验证ST,从而SSO。【如果失效重登录或注销时,怎么通知其它系统更新SESSION信息呢??TicketGrantingTicketImpl类grantServiceTicket方法里this.services.put(id,service);可见CAS端已经记录了当前登录的子系统】
    单点退出:
    4.再次访问http://localhost:8080/a
    CLIENT:没票据但是SESSION中有消息故不跳转也不用发CAS验证票据,允许用户访问


http://chatgpt.dhexx.cn/article/OvwsTcT8.shtml

相关文章

CAS单点登录原理

转载地址:转载博客 1、基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户…

python iloc函数_如何使用python语言中pandas模块中的iloc方法

在python语言中,pandas模块中的iloc方法,可以截取矩阵,获取部分矩阵元素、行和列。下面利用实例说明iloc方法的用法,操作如下: 工具/原料 python pycharm 截图工具 方法/步骤 1 打开pycharm工具,新建python文件,导入numpy和pandas,调用DataFrame生成矩阵 2 保存…

python iloc和loc切片

文章目录 一、含正负号的下标二、loc和iloc1. 利用loc、iloc提取行数据2. 利用loc、iloc提取列数据3.利用loc、iloc提取指定行、指定列数据4.利用loc、iloc提取所有数据5.利用loc函数,根据某个数据来提取数据所在的行 一、含正负号的下标 正下标从0开始,…

Pandas之iloc、loc

除了最基本的筛选外,例:data[‘A’] 还有loc、iloc、ix(已不推荐使用) 我对它们的区分,说loc(location),在教室里找不认识的同学的位置一样的,找人肯定要知道名字或者身…

iloc函数使用方法

iloc函数使用方法 iloc[ : , : ] 前面的冒号就是取行数,后面的冒号是取列数 左闭右开原则 举个例子来理解切片的概念。 animals[2;5] 其中2,5都是指的元素的索引,索引从0开始,表示从第3个元素到第四个元素(前开后闭…

Pandas loc与iloc

先来看一下示例: #!/usr/bin/python import pandas as pd# 三个字段 name, site, age nme ["Google", "Runoob", "Taobao", "Wiki"] st ["www.google.com", "www.runoob.com", "www.taobao.co…

iloc函数

iloc函数 注意:以 **,**为分界 这样看更直观一点 原文链接:iloc

Python学习.iloc和.loc区别、联系与用法

最近接触到数据科学,需要对一些数据表进行分析,观察到代码中一会出现loc一会又出现iloc,下面对两者的用法给出我的一些理解。 1.联系 (1)操作对象相同:loc和iloc都是对DataFrame类型进行操作; (2)完成目的相同&…

Pandas中的loc与iloc用法详解

1.基本简介 1.1 loc与iloc基本含义 loc函数:通过行索引 “Index” 中的具体值来取行数据(如取"Index"为"A"的行) iloc函数:通过行号来取行数据(如取第二行的数据) 注:loc是…

JavaScript鼠标移动事件

下面我们来看一个JavaScript鼠标移动选择器时发生改变的列子,图1是它的一个简单的布局, 接下来是它的css部分和js部分,js部分很简单 最后的效果图就出来了

js——设置鼠标悬停事件

鼠标悬停前后 function HoverAndMouseout(){$(".zhangjie").hover(function () {$(this).css({ "width": "500px" });//移上宽度变为500});$(".zhangjie").mouseout(function () {$(this).css({ "width": "170px"…

前台JS:通过Hover(鼠标悬停事件)动态悬浮显示DIV的ID

HTML代码&#xff1a;定义两个DIV并设置大小宽度 <div id"Div1" class"div-list" style"width:20px; height:50px; border:1px solid #F00"><a>DIV1</a></div><div id"Div2" class"div-list1" …

[前端] js鼠标停留事件

在写某个网页作业时&#xff0c;要用到这个基本技能&#xff0c;就是鼠标放到某一选项上变个色&#xff0c;移开后又变回来。 这个在网页中很常见&#xff0c;实现也很简单&#xff0c;写一个小的例子&#xff0c;放在这里方便以后作为模板用。 <!DOCTYPE html PUBLIC "…

jquery的鼠标悬停与移出事件

需求&#xff1a; 实现鼠标悬停在div标签时&#xff0c;背景变为蓝色&#xff0c;字体变红变大&#xff0c;鼠标离开后 背景变白&#xff0c;字体变小 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta nam…

JavaScript事件 鼠标事件

JavaScript事件&#xff0c;事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。 JavaScript 与 HTML 之间的交互是通过事件实现的。对于 Web 应用来说&#xff0c;有下面这些代 表性的事件&#xff1a;单击事件、鼠标移入移出事件、键盘按下/弹起事件等等。 鼠标事件&…

JavaScript 鼠标移动事件

今天我要分享的JavaScript鼠标移动事件的知识点 1.首先准备一个文件夹和一张GIF的动图&#xff0c;打开VS Code&#xff0c;新建一个文件,CtrlS保存文件&#xff0c;输入文件名&#xff0c;文本类型设置成HTML&#xff0c;如下图所示&#xff1b; 2.在文档里输入英文状态下的感…

js 鼠标按下并移动事件

html源码&#xff1a; <divonMouseDown{(e) >fn1(e)}onMouseUp{(e)>fn2(e)}>内容</div> js源码 fn1(event) > { //鼠标按下事件console.log(onMouseDown, event); //鼠标按下时移动鼠标事件&#xff08;鼠标未抬起&#xff09;document.onmousemove fun…

JS小技巧:鼠标悬停事件

简单的JS悬停图片变换 不多bb先看效果图 可以看到鼠标悬停在不同的标题上时&#xff0c;下方的图片会产生相应变换 代码如下 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>* {margin: 0;p…

js鼠标事件

通过鼠标触发事件, 类似用户的行为: 属性 描述 onclick 当单击鼠标时运行脚本 ondblclick 当双击鼠标时运行脚本 onmousedown 当按下鼠标按钮时运行脚本 onmousemove 当鼠标指针移动时运行脚本 onmouseout 当鼠标指针移出元素时运行脚本 onmouseover 当鼠标指针移…