`

SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    博客分类:
  • cas
 
阅读更多
 

完整版在百度的 链接:http://hi.baidu.com/ae6623/item/b05ae8501510e93094eb05ae (疯狂点击进入查看完整版)

文中所有资料+程序下载地址:在文章中最下方。

 

 

上图:一会上原理分析:(本篇不涵盖cas代理认证模式,代理目前还没用到。)

 

1)PPT流程图:

 

一、用户第一次访问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

 

[html] view plaincopy
 
  1. <!-- 用于单点登录 -->  
  2.     <filter>  
  3.         <filter-name>CAS Filter</filter-name>  
  4.         <filter-class>  
  5.             edu.yale.its.tp.cas.client.filter.CASFilter  
  6.         </filter-class>  
  7.         <init-param>  
  8.             <param-name>  
  9.                 edu.yale.its.tp.cas.client.filter.loginUrl  
  10.             </param-name>  
  11.             <param-value>  
  12.                 http://192.168.168.141:8080/casServer/login  
  13.             </param-value>  
  14.         </init-param>  
  15.         <init-param>  
  16.             <param-name>  
  17.                 edu.yale.its.tp.cas.client.filter.validateUrl  
  18.             </param-name>  
  19.             <param-value>  
  20.                 http://192.168.168.141:8080/casServer/serviceValidate  
  21.             </param-value>  
  22.         </init-param>  
  23.         <init-param>  
  24.             <param-name>  
  25.                 edu.yale.its.tp.cas.client.filter.serverName  
  26.             </param-name>  
  27.             <param-value>192.168.168.141:8080</param-value>  
  28.         </init-param>  
  29.     </filter>  


 

从中可以看到client2的域网址是192.168.168.141:8080,地址是http://192.168.168.141:8080/client2/

 

client3的web.xml


 

[html] view plaincopy
 
  1. <!-- 用于单点登录 -->  
  2.  <filter>  
  3.    <filter-name>CAS Filter</filter-name>  
  4.    <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>  
  5.    <init-param>  
  6.      <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>  
  7.      <param-value>http://192.168.168.141:8080/casServer/login</param-value>  
  8.    </init-param>  
  9.    <init-param>  
  10.      <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>  
  11.      <param-value>http://192.168.168.141:8080/casServer/serviceValidate</param-value>  
  12.    </init-param>  
  13.    <init-param>  
  14.      <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>  
  15.      <param-value>192.168.168.141:8080</param-value>  
  16.    </init-param>  
  17.  </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

 

[html] view plaincopy
 
  1. <!-- 用于单点登录 -->  
  2.  <filter>  
  3.    <filter-name>CAS Filter</filter-name>  
  4.    <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>  
  5.    <init-param>  
  6.      <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>  
  7.      <param-value>http://192.168.168.141:8080/casServer/login</param-value>  
  8.    </init-param>  
  9.    <init-param>  
  10.      <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>  
  11.      <param-value>http://192.168.168.141:8080/casServer/serviceValidate</param-value>  
  12.    </init-param>  
  13.    <init-param>  
  14.      <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>  
  15.      <param-value>192.168.168.141:7777</param-value>  
  16.    </init-param>  
  17.  </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传回前台,这个过程我分析一下。

 

[javascript] view plaincopy
 
  1. <script type="text/javascript">  
  2.         function validataUser() {  
  3.             $.ajax({  
  4.                     type: "POST",  
  5.                     url: "http://192.168.168.141:8080/client3/query",  
  6.                     dataType: "json",  
  7.                     beforeSend: function(XMLHttpRequest){  
  8.                         alert("请求前");  
  9.                     },  
  10.                     success: function (data){  
  11.             alert("跨域返回数据:" + data.userName);  
  12.                         $("#user").val(data.userName);  
  13.                     },  
  14.         complete: function(XMLHttpRequest, textStatus){  
  15.                                  alert("完成");  
  16.                     },  
  17.         error: function(){  
  18.                  alert("错误");  
  19.                     }  
  20.             });  
  21.         }       
  22.    </script>  

 

ajax虽然是异步的,但是也算是发了一个请求,跟我们直接登录了client2之后,打开新的标签页,直接输入网址是一个效果(同测试二中的第4步),client3会在自己的session中检测有没有令牌凭证,如果没有,直接跑到cas-server端,server端拿到cookie,判断已经登录,就生成ST给client3,然后client3拿着这个ST去cas-server端校验,验证成功后,响应用户的ajax请求,把数据返回过来。

 

 

 

 

 

 

 

测试五:

 

(7)用client2去访问client4(不同域情况下用ajax+jsonp跨域拿后台数据)(不同域 )

[javascript] view plaincopy
 
  1. <script type="text/javascript">  
  2.             function validataUser() {  
  3.                 $.ajax({  
  4.                         type: "POST",  
  5.                         url: "http://192.168.168.141:7777/client4/query",  
  6.                         dataType: "jsonp",  
  7.                         jsonp:"callback",  
  8.                         //url: "http://192.168.168.141:8080/client3/query",  
  9.                         //dataType: "json",  
  10.                         beforeSend: function(XMLHttpRequest){  
  11.                             alert("请求前");  
  12.                         },  
  13.                         success: function (data){  
  14.             alert("跨域返回数据:" + data.userName);  
  15.                             $("#user").val(data.userName);  
  16.                         },  
  17.                              
  18.             complete: function(XMLHttpRequest, textStatus){  
  19.                                      alert("完成");  
  20.                         },  
  21.             error: function(){  
  22.                      alert("错误");  
  23.                         }  
  24.                 });  
  25.             }       
  26.        </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加载错误的报告。这个源码一定要配合我的文章,否则你无法运行。

2013年4月25日9:52:11

qq 394263788

 

  csdn上面排版不给力,上百度截图和链接:想看着舒服的去我的百度空间看吧。


 完整版在百度的 链接:http://hi.baidu.com/ae6623/item/b05ae8501510e93094eb05ae

分享到:
评论

相关推荐

    落雨博客基于CAS框架的单点登录技术讲解(ppt+code实例+doc)配套资料

    [置顶] SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析 http://blog.csdn.net/ae6623/article/details/8848107 目 录 1 引言 4 1.1 摘要 4 1.2 范围 4 1.3 读者对象 4 1.4 关键词 4 2 ...

    SSO之CAS单点登录客户端服务端jar包

    在"SSO之CAS单点登录客户端服务端jar包"中,包含的是实现CAS单点登录功能所需的客户端和服务端组件。这些jar包包含了以下关键知识点: 1. **CAS服务器**:这是整个SSO架构的核心,负责处理用户的登录请求,验证凭证...

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。本压缩包提供了CAS服务端自定义认证的实现,以及CAS客户端的配置...

    CAS单点登录例子,包含服务端和客户端

    综上所述,这个压缩包提供了一个完整的CAS单点登录实例,包括服务端和客户端的实现,可以帮助开发者理解并部署自己的CAS系统。通过深入研究和实践,你可以掌握如何利用CAS实现Web应用的安全、便捷的单点登录功能。

    cas sso单点登录已搭建好的源码-内含客户端和服务端

    CAS(Central Authentication Service)SSO(Single Sign-On)是一种广泛使用的身份验证协议,它允许用户通过一次登录,就能访问多个相互信任的应用系统,无需多次输入凭证。本资源包含已搭建好的CAS SSO服务端和...

    sso/cas单点登录Java maven版 含服务端客服端

    CAS(Central Authentication Service)是SSO的一种实现,由耶鲁大学开发并开源,它提供了一个中心化的认证服务器和一系列协议来实现SSO。本项目是一个基于Java Maven构建的SSO解决方案,包括服务端和客户端两部分。...

    Java进阶SSO单点登录技术CAS-快速上手与原理探究视频教程

    2、 CAS Server服务端和客户端的搭建和配置 3、 单点登录和单点登出的实现和测试 4、 单点登录、登出的原理探究等 知识点 l 相关概念或术语:SSO、CAS、TGT、TGC、ST l CAS Server服务端的搭建和配置 l CAS Client...

    cas实现单点登录服务端及客户端

    CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,SSO)框架,由耶鲁大学开发并维护。SSO允许用户通过一次登录验证就能访问多个应用系统,无需在每个系统之间单独进行...

    CAS实现sso单点登录原理

    "CAS实现sso单点登录原理" CAS(Central Authentication Service)是Yale大学发起的一个企业级的、开源的项目,旨在为Web应用系统提供一种可靠的单点登录解决方法(属于Web SSO)。CAS开始于2001年,并在2004年12月...

    CAS服务端和客户端war包.rar

    CAS(Central Authentication Service)是基于Java的开源身份验证框架,主要功能是实现单点登录(Single Sign-On,SSO)。这个压缩包“CAS服务端和客户端war包.rar”包含了实现CAS服务所需的所有核心组件和两个...

    cas服务端和客户端可用代码

    CAS(Central Authentication Service)是一种基于Web的单一登录(Single Sign-On, SSO)协议,它允许用户通过一个统一的身份验证入口点登录,然后在多个应用系统间自由切换,而无需再次进行身份验证。这个给定的...

    cas单点登录服务端+客户端demo

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决用户在多个应用系统间切换时需要多次认证的问题。它提供了一个集中式的登录入口,用户只需在一...

    cas单点登录代码例子 有文档 服务端客户端例子 亲测可用

    CAS(Central Authentication Service)是Java开发的一个开源单点登录(Single Sign-On,SSO)框架,主要用于实现用户在多个应用系统中的统一身份验证。在这个压缩包中,包含了一个CAS服务端和客户端的代码实例,...

    单点登录CAS.net客户端源码

    本资源“单点登录CAS.net客户端源码”提供了实现CAS协议的.NET客户端源代码,适用于.NET框架的项目。 首先,我们需要理解CAS的基本工作流程。当用户尝试访问一个受CAS保护的资源时,会被重定向到CAS服务器进行身份...

    cas 普通方式和SpringBoot方式客户端 普通方式服务端

    接下来,`sacclient2`和`sacclient`可能是CAS客户端的实现,用于与CAS服务器进行交互。它们可能提供了API或命令行工具,使得应用能够验证用户的身份并获取必要的票据信息。在普通方式下,客户端通常会处理HTTP重定向...

    cas.rar_cas java_cas服务端代码_单点登录

    CAS(Central Authentication Service)是...综上所述,这个“cas.rar”压缩包是学习和实践CAS单点登录服务端开发的宝贵资源,通过研究其中的代码,开发者可以掌握CAS的工作原理,进而实现和定制自己的SSO解决方案。

    cas客户端集成单点登录代码

    在本文中,我们将深入探讨如何将CAS客户端集成到您的应用程序中,实现单点登录功能。 首先,理解CAS的基本工作原理是至关重要的。CAS服务器作为一个中心认证服务,用户只需在该服务器上进行一次身份验证,之后便...

    Weblogic使用YALE(耶鲁)CAS实现SSO单点登录 的方法.doc

    Weblogic 使用 YALE CAS 实现 SSO 单点登录的方法 一、Yale CAS 简介 Yale CAS 是耶鲁大学开发的一种开源的单点登录(SSO)解决方案,提供了一个通用的身份验证框架,允许用户使用单个身份验证来访问多个应用程序。...

    SSO之CAS单点登录详细图文教程

    通过学习本教程,你将能够理解CAS的工作原理,配置CAS服务器和客户端,实现单点登录,并能处理常见的安全问题。请参考提供的文档和代码示例逐步操作,确保每个步骤都正确无误。祝你在SSO之旅上顺利!

    cas-server sso单点登录服务端

    总的来说,CAS-server SSO服务端是一个强大的工具,它为企业提供了一种高效、安全的单点登录解决方案。理解其工作原理和配置方法对于构建和维护一个统一的认证环境至关重要。通过深入学习和实践,我们可以利用"cas-...

Global site tag (gtag.js) - Google Analytics