cas详细登录流程

本文深入解析CAS认证系统的工作流程,包括初次访问、二次访问及跨域登录的具体步骤,阐述了ST、TGT、TGC等关键概念及其在认证过程中的作用。

一、登录流程uml解析

在这里插入图片描述

二、登录流程http请求跟踪解析

上图是3个登录场景,分别为:第一次访问www.qiandu.com、第二次访问、以及登录状态下第一次访问mail.qiandu.com。

下面就详细说明上图中每个数字标号做了什么,以及相关的请求内容,响应内容。

 

2.1、第一次访问www.qiandu.com

标号1:用户访问http://www.qiandu.com,经过他的第一个过滤器(cas提供,在web.xml中配置)AuthenticationFilter。

      过滤器全称:org.jasig.cas.client.authentication.AuthenticationFilter

      主要作用:判断是否登录,如果没有登录则重定向到认证中心。

标号2:www.qiandu.com发现用户没有登录,则返回浏览器重定向地址。

      

      首先可以看到我们请求www.qiandu.com,之后浏览器返回状态码302,然后让浏览器重定向到cas.qiandu.com并且通过get的方式添加参数service,该参数目的是登录成功之后会要重定向回来,因此需要该参数。并且你会发现,其实server的值就是编码之后的我们请求www.qiandu.com的地址。

标号3:浏览器接收到重定向之后发起重定向,请求cas.qiandu.com。

标号4:认证中心cas.qiandu.com接收到登录请求,返回登陆页面。

      

      上图就是标号3的请求,以及标号4的响应。请求的URL是标号2返回的URL。之后认证中心就展示登录的页面,等待用户输入用户名密码。

标号5:用户在cas.qiandu.com的login页面输入用户名密码,提交。

标号6:服务器接收到用户名密码,则验证是否有效,验证逻辑可以使用cas-server提供现成的,也可以自己实现。

      

      上图就是标号5的请求,以及标号6的响应了。当cas.qiandu.com即csa-server认证通过之后,会返回给浏览器302,重定向的地址就是Referer中的service参数对应的值。后边并通过get的方式挟带了一个ticket令牌,这个ticket就是ST(数字3处)。同时会在Cookie中设置一个CASTGC,该cookie是网站cas.qiandu.com的cookie,只有访问这个网站才会携带这个cookie过去。

      Cookie中的CASTGC:向cookie中添加该值的目的是当下次访问cas.qiandu.com时,浏览器将Cookie中的TGC携带到服务器,服务器根据这个TGC,查找与之对应的TGT。从而判断用户是否登录过了,是否需要展示登录页面。TGT与TGC的关系就像SESSION与Cookie中SESSIONID的关系。

      TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他可以签发ST)

      TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他可以找到TGT。

      ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就失效了。也就是上面数字3处的ticket值。

标号7:浏览器从cas.qiandu.com哪里拿到ticket之后,就根据指示重定向到www.qiandu.com,请求的url就是上面返回的url。

      

标号8:www.qiandu.com在过滤器中会取到ticket的值,然后通过http方式调用cas.qiandu.com验证该ticket是否是有效的。

标号9:cas.qiandu.com接收到ticket之后,验证,验证通过返回结果告诉www.qiandu.com该ticket有效。

标号10:www.qiandu.com接收到cas-server的返回,知道了用户合法,展示相关资源到用户浏览器上。

      

      至此,第一次访问的整个流程结束,其中标号8与标号9的环节是通过代码调用的,并不是浏览器发起,所以没有截取到报文。

 

2.2、第二次访问www.qiandu.com

上面以及访问过一次了,当第二次访问的时候发生了什么呢?

标号11:用户发起请求,访问www.qiandu.com。会经过cas-client,也就是过滤器,因为第一次访问成功之后www.qiandu.com中会在session中记录用户信息,因此这里直接就通过了,不用验证了。

标号12:用户通过权限验证,浏览器返回正常资源。

 

2.3、访问mail.qiandu.com

标号13:用户在www.qiandu.com正常上网,突然想访问mail.qiandu.com,于是发起访问mail.qiandu.com的请求。

标号14:mail.qiandu.com接收到请求,发现第一次访问,于是给他一个重定向的地址,让他去找认证中心登录。

      

      上图可以看到,用户请求mail.qiandu.com,然后返回给他一个网址,状态302重定向,service参数就是回来的地址。

标号15:浏览器根据14返回的地址,发起重定向,因为之前访问过一次了,因此这次会携带上次返回的Cookie:TGC到认证中心。

标号16:认证中心收到请求,发现TGC对应了一个TGT,于是用TGT签发一个ST,并且返回给浏览器,让他重定向到mail.qiandu.com

      

      可以发现请求的时候是携带Cookie:CASTGC的,响应的就是一个地址加上TGT签发的ST也就是ticket。

标号17:浏览器根据16返回的网址发起重定向。

标号18:mail.qiandu.com获取ticket去认证中心验证是否有效。

标号19:认证成功,返回在mail.qiandu.com的session中设置登录状态,下次就直接登录。

标号20:认证成功之后就反正用想要访问的资源了。

      


### CAS单点登录实现流程详解 CAS(Central Authentication Service)是一种广泛使用的单点登录SSO, Single Sign-On)解决方案,其核心目标是让用户只需登录一次即可访问多个应用系统。以下是CAS单点登录详细实现流程: #### 1. 用户首次访问受保护资源 当用户尝试访问某个受保护的应用程序时,该应用程序会检查用户是否已经通过认证[^2]。如果未检测到有效的认证凭证,则应用程序会将用户重定向至CAS服务器。 #### 2. 用户被重定向到CAS服务器 在这一阶段,用户的浏览器会被重定向到CAS服务器的登录页面。此时,URL中通常携带了一个`service`参数,用于指定用户最终需要跳转回的目标地址[^1]。 #### 3. 用户提交登录表单 用户在CAS服务器的登录页面输入用户名和密码并提交表单。随后,CAS服务器会对这些凭据进行验证[^3]。 #### 4. 认证成功或失败处理 - **认证成功**:如果用户提供的凭据有效,CAS服务器会生成一个短期票据(Service Ticket, ST),并将此票据附加到重定向响应中,同时将用户重定向回原始请求的服务地址[^4]。 - **认证失败**:如果用户提供错误的凭据,CAS服务器会向客户端返回一个错误消息,例如`INVALID_CREDENTIALS`[^4]。 #### 5. 客户端验证服务票据 当用户被重定向回到最初请求的应用程序时,该应用程序会提取出由CAS服务器颁发的服务票据,并将其发送给CAS服务器以验证有效性。这一步骤涉及调用CAS服务器的`/validate`或`/serviceValidate`接口[^5]。 #### 6. 返回用户信息 如果服务票据验证成功,CAS服务器会返回关于已认证用户的相关信息(如用户名)。此时,应用程序可以根据接收到的信息创建本地会话或其他形式的身份标识符[^2]。 #### 7. 后续访问其他受保护资源 一旦用户完成初次认证,在一定时间内再次访问其他同样支持CAS协议的应用程序时,由于存在统一的认证状态记录(通常是基于Cookie存储的TGT票根),因此无需重复经历整个登录过程[^1]。 --- ### 示例代码展示 以下是一个简单的Java代码片段,演示如何校验来自CAS服务器的服务票据: ```java public class CasAuthentication { public static void main(String[] args) throws Exception { String serviceUrl = "https://example.com/app"; String casServerUrlPrefix = "https://cas.example.org/cas"; // 构造完整的验证URL URL validationUrl = new URL(casServerUrlPrefix + "/serviceValidate?ticket=ST-12345&service=" + URLEncoder.encode(serviceUrl, "UTF-8")); try (BufferedReader reader = new BufferedReader(new InputStreamReader(validationUrl.openStream()))) { StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } System.out.println(response.toString()); } catch (Exception e) { System.err.println("Failed to validate ticket."); } } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值