SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
落雨 cas 单点登录
一、用户第一次访问web1应用。



ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步。。。谢谢提醒。而且,重定向肯定是从浏览器过去的。我写的不严谨,画的比较通俗了。。。因该像下面这张图一样就ok了!!PPT自己下载下来修改吧,我就不改了。

二、用户第一次访问web2应用。


困扰了好久的流程,其实静下进来搜个一二十篇百度上的讲解,集众家之所长,加上自己的理解,不难发现,流程理解下来很是简单。
下面讲一下原理:

2)简易流程图:
一、用户第一次访问web1应用

二、用户第一次访问web2应用

3)文字流程:
一、用户第一次访问web1应用
1、Web1的客户端检测到session中无令牌凭证信息,将用户重定向到Cas-server端进行验证。
2、s端检测到传来的请求没有带ST参数,所以跳到Login页面进行用户登录验证。
3、s端认证结束后,生成TGT令牌和随机Ticket-ST,并且在用户的浏览器中写入Cookie-STC,随后让用户的浏览器重定向到Web1应用中,并将随机参数ST带上一起传参过去,之后Web1的cas客户端将检测到此ST参数,发送到server端进行校验,校验成功之后,服务端主动销毁此ST,并继续返回到web1应用中,web1应用此时将令牌信息写入到自己的session中,从而完成用户的单点登录认证,服务端同样的也会用一个Map记录web1加入到单点登录范围内。
4、带上ST参数重定向到web1应用。
5、web1拿到ST参数发送到s端进行校验。
6、校验成功,进入W1应用,w1将令牌凭证TGT写入session,与此同时,完成用户第一次访问应用web1的情形。
二、用户第一次访问web2应用
1、此时,用户第一次访问Web2应用,web2在自己的session中无法找到令牌信息,所以将用户重定向到S端,S端拿到用户的浏览器传来的cookie,从里面读出TGT,生成一个随机的ST,发回w2,w2拿到ST,就立即和S端进行校验,S端校验成功后,立即销毁此ST,并将web2加入到单点登录范围内,用户此时可以在Web2中进行业务操作,web2也同样的会在session中记录此令牌凭证,至此,完成用户的单点登录功能。当用户下次访问web1或者web2的时候,由于各自的session中能够拿到TGT信息,所以,只需要从中读到每次请求时所带的ST参数即可和S端进行交互,验证正确之后达到一站登录,N站访问的SSO效果。
2、w2让用户浏览器带cookie重定向到S端。
3、s端认证结束后,生成TGT令牌和随机Ticket-ST,并且在用户的浏览器中写入Cookie-STC,随后让用户的浏览器重定向到Web1应用中,并将随机参数ST带上一起传参过去,之后Web1的cas客户端将检测到此ST参数,发送到server端进行校验,校验成功之后,服务端主动销毁此ST,并继续返回到web1应用中,web1应用此时将令牌信息写入到自己的session中,从而完成用户的单点登录认证,服务端同样的也会用一个Map记录web1加入到单点登录范围内。
4、w2根据参数ST发回到s端进行校验
5、校验成功,可以访问W2,W2令牌写入session。
4)程序流程
来两段程序玩玩,打开你的火狐谷歌调试器,IE的就算了。
用Tomcat 7 搭载 cas-server 端。
用Tomcat 6 搭载你的web1和web2和web3...
之后我们开始今天的玩法
1.不登陆直接访问client2
2.不登陆直接访问client3
3.登录client2成功后,访问client3(同域 )
4.登录client3成功后,访问client2(同域 )
5.登录client2或者client3成功后,访问client4(不同域)
6.用client2去访问client3 (同域情况下用ajax拿后台的数据过来)(同域 )
7.用client2去访问client4(不同域情况下用ajax+jsonp跨域拿后台数据)(不同域 )
8.你是不是又想到了更疯狂的,来留言实验一把。
实验截图和结果以及调试分析:
测试一:
(1)不登陆直接访问client2
(2)不登陆直接访问client3
client2的web.xml
- <!-- 用于单点登录 -->
- <filter>
- <filter-name>CAS Filter</filter-name>
- <filter-class>
- edu.yale.its.tp.cas.client.filter.CASFilter
- </filter-class>
- <init-param>
- <param-name>
- edu.yale.its.tp.cas.client.filter.loginUrl
- </param-name>
- <param-value>
- http://192.168.168.141:8080/casServer/login
- </param-value>
- </init-param>
- <init-param>
- <param-name>
- edu.yale.its.tp.cas.client.filter.validateUrl
- </param-name>
- <param-value>
- http://192.168.168.141:8080/casServer/serviceValidate
- </param-value>
- </init-param>
- <init-param>
- <param-name>
- edu.yale.its.tp.cas.client.filter.serverName
- </param-name>
- <param-value>192.168.168.141:8080</param-value>
- </init-param>
- </filter>
从中可以看到client2的域网址是192.168.168.141:8080,地址是http://192.168.168.141:8080/client2/
client3的web.xml
- <!-- 用于单点登录 -->
- <filter>
- <filter-name>CAS Filter</filter-name>
- <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
- <init-param>
- <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
- <param-value>http://192.168.168.141:8080/casServer/login</param-value>
- </init-param>
- <init-param>
- <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
- <param-value>http://192.168.168.141:8080/casServer/serviceValidate</param-value>
- </init-param>
- <init-param>
- <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
- <param-value>192.168.168.141:8080</param-value>
- </init-param>
- </filter>
从中可以看到client3的域网址是192.168.168.141:8080,地址是http://192.168.168.141:8080/client3/
1.现在打开你的浏览器,抡起袖子疯狂点击我们可怜的web应用--client2,果然,直接跳到了cas的登录界面。下面的cookie里面毛都米有。

测试二:
(3).登录client2成功后,访问client3(同域 )
(4).登录client3成功后,访问client2(同域 )
1.好吧,我们输入用户名和密码,点击登录

2.来分析一下cookie。说时迟,那时快,它已经从cas的server端用户验证成功后回来了。。不仅用户验证完成,而且还不忘记拿到ST参数后,又一次发回去然后也顺利回来了。此时已经完成了用户的单点登录。

3.顺利登录成功之后,我们清除一下火狐的网络信息,来直接点击超链接访问client3,
之前的ST,我们记录一下:ST-5-beGeNw5zW0x56vpnmotG-cas01.example.org
此时得到了一个ST : ST-4-jkFHgkJkvTZVJt22SUNV-cas01.example.org
啧啧,ST果然是不一致的
言归正传,分析一下。
因为我们是在client2里面点击的超链接的形式访问的client3,所以ST参数肯定带过去了,Server端一查,哎呦,你小子有ST,我来检测一下,我靠,居然是正确的ST,好吧,允许你通过,此时,用户神不知鬼不觉,感觉犹如神助一般,进入了client3
4.那么我们来测试一下,直接在成功登录了client2之后,浏览器里输入clint3的网址。


从网络分析抓包里我们可以看到,也是这两个请求,和点击了超链接到client3一样的两个请求。。
说明server端已经拿到了用户的浏览器中的cookie,并且生成了ST给client3,client3也已经和server端交互结束,包括验证ST,而这一切,肉眼果然看不出来。
测试三:
(5)登录client2或者client3成功后,访问client4(不同域)
client4的web.xml
- <!-- 用于单点登录 -->
- <filter>
- <filter-name>CAS Filter</filter-name>
- <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
- <init-param>
- <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
- <param-value>http://192.168.168.141:8080/casServer/login</param-value>
- </init-param>
- <init-param>
- <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
- <param-value>http://192.168.168.141:8080/casServer/serviceValidate</param-value>
- </init-param>
- <init-param>
- <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
- <param-value>192.168.168.141:7777</param-value>
- </init-param>
- </filter>
从中可以看到client2的域网址是192.168.168.141:7777,地址是http://192.168.168.141:7777/client4/

已经带cookie验证之后,接到ST参数ticket,然后和server端验证结束。完成了client4的登录。
下面我们开始研究ajax异步获取数据的方式,看看异步的情况下,cas有没有失效。
测试四:
(6)用client2去访问client3 (同域情况下用ajax拿后台的数据过来)(同域 )
先登录client2,然后不登陆client3的情况下,用ajax传数据到后台,后天生成json传回前台,这个过程我分析一下。
- <script type="text/javascript">
- function validataUser() {
- $.ajax({
- type: "POST",
- url: "http://192.168.168.141:8080/client3/query",
- dataType: "json",
- beforeSend: function(XMLHttpRequest){
- alert("请求前");
- },
- success: function (data){
- alert("跨域返回数据:" + data.userName);
- $("#user").val(data.userName);
- },
- complete: function(XMLHttpRequest, textStatus){
- alert("完成");
- },
- error: function(){
- alert("错误");
- }
- });
- }
- </script>
ajax虽然是异步的,但是也算是发了一个请求,跟我们直接登录了client2之后,打开新的标签页,直接输入网址是一个效果(同测试二中的第4步),client3会在自己的session中检测有没有令牌凭证,如果没有,直接跑到cas-server端,server端拿到cookie,判断已经登录,就生成ST给client3,然后client3拿着这个ST去cas-server端校验,验证成功后,响应用户的ajax请求,把数据返回过来。


测试五:
(7)用client2去访问client4(不同域情况下用ajax+jsonp跨域拿后台数据)(不同域 )
- <script type="text/javascript">
- function validataUser() {
- $.ajax({
- type: "POST",
- url: "http://192.168.168.141:7777/client4/query",
- dataType: "jsonp",
- jsonp:"callback",
- //url: "http://192.168.168.141:8080/client3/query",
- //dataType: "json",
- beforeSend: function(XMLHttpRequest){
- alert("请求前");
- },
- success: function (data){
- alert("跨域返回数据:" + data.userName);
- $("#user").val(data.userName);
- },
- complete: function(XMLHttpRequest, textStatus){
- alert("完成");
- },
- error: function(){
- alert("错误");
- }
- });
- }
- </script>

不知不觉就又是一趟流程,client4此时也被记录到cas-server端,加入单点登录的范围。下次再来的时候就直接在client4的客户端过滤器里面检测session即可。
至此,已经彻底测试了7种情况,跨域和不跨域都有所涉及。下篇我们将开始对cas-server端的征程,包括对服务端常用核心源码的研究以及关于多数据库之间的配置,之后便是DIY自定义登录页面。
文中所有资料下载地址:http://download.csdn.net/detail/ae6623/5303255
程序端配置:如果自己没有Oracle和MySQL请注销掉C:\tomcat7\webapps\casServer\WEB-INF\deployerConfigContext.xml中的相关配置,否则会报mysql数据源找不到或者oracle加载错误的报告。这个源码一定要配合我的文章,否则你无法运行。
SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析的更多相关文章
- cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...
- cas sso单点登录系列4_cas-server登录页面自定义修改过程(jsp页面修改)
转:http://blog.csdn.net/ae6623/article/details/8861065 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标: ...
- SSO单点登录系列4:cas-server登录页面自定义修改过程(jsp页面修改)
落雨 cas 单点登录 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标: 下面是正文: 打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一 ...
- SSO单点登录系列1:cas客户端源码分析cas-client-java-2.1.1.jar
落雨 cas 单点登录 希望能给以后来研究cas的兄弟留下一点思路,也算是研究了两天的成果,外国人的代码写的很晦涩,翻译下来也没有时间继续跟进,所以有错误的还请大家跟帖和我讨论,qq 39426378 ...
- cas sso单点登录系列1_cas-client Filter源码解码(转)
转:http://blog.csdn.net/ae6623/article/details/8841801?utm_source=tuicool&utm_medium=referral /* ...
- IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...
- android客户端app和服务端交互token的作用
Android客户端和服务端如何使用Token和Session niceheart关注1人评论34644人阅读2014-09-16 16:38:44 对于初学者来说,对Token和Session的 ...
- Android客户端与PHP服务端交互(一)---框架概述
背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事 ...
- cas sso单点登录系列7_ 单点登录cas常见问题系列汇总
转:http://blog.csdn.net/matthewei6/article/details/50709252 单点登录cas常见问题(一) - 子系统是否还要做session处理?单点登录ca ...
随机推荐
- 【转】Visual Studio 2013 Tools for Unity安装目录,Visual Studio 2013 Tools.unitypackage
http://blog.csdn.net/dynastyting/article/details/46505349 Visual Studio 2013 Tools for Unity安装目录 D:\ ...
- jquery中attr和prop的区别介绍
在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很多.这里谈谈我的心得,我的心得很简单: ...
- bzoj4030【HEOI2015】小L的白日梦
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4030 sol :orz Yousiki http://www.cnblogs.com/you ...
- xtrabackup安装使用说明
软件介绍: Percona XtraBackup是一块开源且免费的对MySQL Innodb存储引擎备份数据的工具,使用此工具的时候不需停止MySQL,而且支持压缩备份,支持对Innodb存储引擎做增 ...
- Robot Framework通过Python SMTP进行email收发测试。
工作中需要对发送的邮件进行过滤,方法基本属于ACL控制,即查看“源/目的”邮件地址,邮件标题,邮件正文,邮件附件等进行过滤. 所以需要先模拟一下用Python能否达到邮件Client,Server的功 ...
- 【转】C#获取客户端及服务器端主机信息及其获取IP地址
原文发布时间为:2009-10-28 -- 来源于本人的百度文章 [由搬家工具导入] 小结: 1、REMOTE_ADDR 不可被修改,但是可能会获得代理服务器的IP,而不是实际客户端的IP。 2、通过 ...
- js81:Image对象,几张图像缓存完之后动画显示,form.elements[],document.images[]
原文发布时间为:2008-11-09 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)
来自:http://blog.csdn.net/zhdwjie/article/details/1490741 -------------------------------------------- ...
- (二)docker的部署安装,配置,基础命令
一.docker 的安装部署 这里不过多介绍,下面这两个linux发型版 安装可以参考 ubuntu的 docker-ce安装 centos7的 docker-ce安装 二.docker配置文件 重要 ...
- hdu 4991(树状数组+DP)
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...