记录一下个人对cas单点登录流程的理解

本篇基于上一篇:https://www.cnblogs.com/aljy/p/9543914.html springsecurity+springboot+cas实现单点登录

这篇文章用的cas版本很旧了,但是我还没时间搞升级,而且实际生产实现的cas还有很多流程没有实现,发布了差不多两年,之前没理解cas为什么能在跨域的情况下实现单点登录,最近两天因为项目原因又重新接触了cas,再次研究了一下才顿悟,这里简单记录一下,以方便自己以后能快速想起这部分的流程

注:本篇只为了自己而写,对各位理解跨域情况下CAS做单点登录的原理流程或许有一些帮助,但是可能有些没头没尾,不太好理解

 

首先可以先看下这篇博客:https://www.cnblogs.com/ruiati/p/6249361.html 我是看了这篇博客才产生了疑惑:如果两个完全不同域名的系统,它们的cookie肯定是不共享的,比如有系统A和B,是两个不同的域名,另有cas系统C,用户访问的流程如下:

1.当用户U第一次访问A的时候,A会验证出用户U是第一次访问,没有session,因此会将请求重定向到C做登录,

2.U在C登录后,C会返回一个ticket并重定向到A的登录请求,比如/login.do

3.这个handler接收ticket然后去C进行验证,当然这个验证过程我们看不到,因为是代码内部发的请求

 

 4.验证成功后,A本地可以加载出用户对应的权限等信息以存储在本地session中,且将响应回一个set-session的响应头,将sessionid存到用户U的cookie

5.当用户U再次访问A时就可以携带这个sessionId,由于A在本地已经有用户U的session,就不用再去请求C进行验证了,直接验证A本地有没有用户U的session即可。

6.用户U访问B,B会验证到用户U在B的本地没有session,验证出没有登录

7.B会重定向到C进行验证。。。。。

这一步先暂停,那么当B重定向到C时,C是怎么知道用户U已经在A登录过了呢?或者说,当B重定向到C时,C是如何知道要进行单点登录验证的是用户U,而不是用户X或用户Y?首先明确一点,A和B是跨域的,域名完全不同,cookie不能共享,也就是说B不知道A有没有登录过,自然也不知道A登录的用户名是什么,或sessionID是什么,那我从B重定向到C时,C到底要验证哪个用户有在C登录过呢?

这个问题,其实很简单,cas的方案就是把一个CASTGC存储在C域名下的cookie中,

 

 

这个CASTGC你可以认为是一个用户标识,代表当前用户U在C登录过了,在第二步的时候,用户在C登录后,不仅做了返回ticket给A,还做了另一步,就是把一个CASTGC存储在用户的cookie中,那么现在我们可以继续了

8.B重定向到C后,重定向的那个请求将会带上CASTGC这个cookie,那么此时C就可以知道,要验证有没有登录过的是谁了

9.C验证这个cookie确实在C登录过之后,就可以下发一个新的ticket返回给B,并重定向携带到B的/login中

10.B接收这个ticket,再去C进行验证,验证成功后,就可以进行本地的session存储和用户U的cookie存储了

11.用户再次访问B,会携带上一步B存储的cookie,B接收到后即可验证用户有没有登录,有登录就可以直接访问

 

posted @ 2020-08-07 12:32  alex-zp  阅读(298)  评论(0)    收藏  举报