CAS单点登陆的原理

1.什么是CAS?

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

2.术语解释

2.1 单点登陆

对于两个相互独立的系统A、B,如果已经登陆了系统A,在访问系统B时不需要再次登陆,这就是单点登陆。

比如我们登陆了QQ,打开QQ空间或QQ邮箱时就不要再输入用户名和密码再次登陆了,这就是单点登陆。

2.2 Service Ticket

Service ticket(ST) :服务票据,服务的惟一标识码 , 由 CAS Server 发出(Http 传送),通过客户端浏览器到达业务服务器端;一个特定的服务只能有一个惟一的 ST.

ST是由CAS服务器生成,并传递给客户端,客户端再使用这个ST向CAS服务器验证身份,验证通过后客户端就通过CAS服务器的身份验证,也就可以创建session了。

ST会保存在CAS服务器中的ConcurrentHashMap,并且可以设置有效期,默认有效期是10秒,可以在配置文件spring-configuration/ticketExpirationPolicies.xml中修改。

2.3 Ticket Granting ticket

Ticket Granting ticket(TGT) :票据授权票据,由 KDC 的 AS 发放。即获取这样一张票据后,以后申请各种其他服务票据 (ST) 便不必再向 KDC 提交身份认证信息 (Credentials) 

TGT由CAS服务器生成,保存在CAS服务器中的ConcurrentHashMap,并且存放到客户端的浏览器的cookie的参数CASTGC中,可以在配置文件spring-configuration/ticketGrantingTicketCookieGenerator.xml中修改。

TGT也可以设置超时时间,默认有效期是8个小时,可以在文件spring-configuration/ticketExpirationPolicies.xml中修改。

CAS的单点登陆就是使用这个TGT来实现。

3.系统部署情况

本人使用的CAS源码包是4.0.0版本的,可以到网上下载CAS的源码包cas-server-4.0.0-release.zip

3.1 首先配置三台tomcat,它们的安装信息如下:

(1)tomcat1 

端口号:8080

部署的WAR包:cas-server-webapp-4.0.0.war

可以将这个WAR包改成名cas.war


(2)tomat2

端口号:8081

部署的WAR包:buyer_center.war

web.xml中的内容如下:


index.jspcontextConfigLocationclasspath*:applicationContext-servlet.xmlorg.springframework.web.context.ContextLoaderListenerencoding-filterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encoding-filter/*annomvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath*:applicationContext-servlet.xml1annomvc*.doCAS Authentication Filterorg.jasig.cas.client.authentication.AuthenticationFiltercasServerLoginUrlhttp://login.mycompany.com:8080/cas/loginserverNamehttp://buyer.mycompany.com:8081CAS Validation Filterorg.jasig.cas.client.validation.Cas10TicketValidationFiltercasServerUrlPrefixhttp://login.mycompany.com:8080/casserverNamehttp://buyer.mycompany.com:8081redirectAfterValidationtrueCAS HttpServletRequest Wrapper Filterorg.jasig.cas.client.util.HttpServletRequestWrapperFilterCAS Assertion Thread Local Filterorg.jasig.cas.client.util.AssertionThreadLocalFilterCAS Authentication Filter/*CAS Validation Filter/*CAS HttpServletRequest Wrapper Filter/*CAS Assertion Thread Local Filter/*

applicationContext-servlet.xml中的内容如下:

  

(3)tomcat3

端口号:8083

部署的WAR包:seller_center.war

web.xml中的内容如下:


index.jspcontextConfigLocationclasspath*:applicationContext-servlet.xmlorg.springframework.web.context.ContextLoaderListenerencoding-filterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8encoding-filter/*annomvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath*:applicationContext-servlet.xml1annomvc*.doCAS Authentication Filterorg.jasig.cas.client.authentication.AuthenticationFiltercasServerLoginUrlhttp://login.mycompany.com:8080/cas/loginserverNamehttp://seller.mycompany.com:8083CAS Validation Filterorg.jasig.cas.client.validation.Cas10TicketValidationFiltercasServerUrlPrefixhttp://login.mycompany.com:8080/casserverNamehttp://seller.mycompany.com:8083redirectAfterValidationtrueCAS HttpServletRequest Wrapper Filterorg.jasig.cas.client.util.HttpServletRequestWrapperFilterCAS Assertion Thread Local Filterorg.jasig.cas.client.util.AssertionThreadLocalFilterCAS Authentication Filter/*CAS Validation Filter/*CAS HttpServletRequest Wrapper Filter/*CAS Assertion Thread Local Filter/*

applicationContext-servlet.xml中的内容如下:

  

3.2 配置HOST文件中的域名

127.0.0.1       login.mycompany.com
127.0.0.1       seller.mycompany.com
127.0.0.1       buyer.mycompany.com

4.CAS实现单点登陆的原理

4.1 访问buyer

buyer.mycompany.com:8081/buyer_center/loginController/login.do

4.2 跳转到CAS登陆页面,并且将访问的URL放到CAS跳转参数service中

http://login.mycompany.com:8080/cas/login?service=http%3A%2F%2Fbuyer.mycompany.com%3A8081%2Fbuyer_center%2FloginController%2Flogin.do


4.3 登陆

输入用户名和密码后就登陆到CAS中,登陆成功后CAS会创建一个Ticket Granting ticket(TGT) ,把它保存在DefaultTicketRegistry中的

Map cache = new ConcurrentHashMap();
并且CAS服务器也会将这个TGT保存到客户端的浏览器的cookie中.

登陆成功后输入:http://login.mycompany.com:8080/cas/login,可以看到TGT。


4.4 CAS登陆成功后跳转service的地址,并且附带一个Service Ticket

buyer.mycompany.com:8081/buyer_center/loginController/login.do?ticket=ST-12-Mfq4OVkBAlddDyx1ucRq-cas01.example.org

客户端buyer_center会去拿到这个ST,并且发送HTTP请求到CAS中去验证,验证通过后客户端就会创建session,并且跳转到

buyer.mycompany.com:8081/buyer_center/loginController/login.do

这样就完成了登陆。

4.5 单点登陆

前面4步已经完成了系统buyer_center的登陆,下面将介绍单点登陆到seller_center的过程。

(1)访问另一系统seller_center

http://seller.mycompany.com:8083/seller_center/loginController/login.do

客户端seller_center的拦截器AuthenticationFilter拦截到当前访问没有session,拦截器Cas10TicketValidationFilter拦截到当前URL没有ST,所以转发到CAS登陆URL。

http://login.mycompany:8080/cas/login?service=http%3A%2F%2Fseller.mycompany.com%3A8083%2Fseller_center%2FloginController%2Flogin.do

(2)CAS服务器会去读取cookie TGT

CAS 服务器会去读取域名login.mycompany.com下的cookie变量CASTGC(里面存放着TGT的值).

CAS服务器会去验证这个TGT是否合法,如果合法,则会创建一个ST并且返回

http://seller.mycompany.com:8083/seller_center/loginController/login.do?ticket=ST-12-Mfq4OVkBAlddDyx1ucRq-cas01.example.org


(3)验证ST合法性

客户端seller_center拿到这个ST后,就会向CAS服务器发送一个HTTP请求,验证ST的合法性,如果合法,则创建一个session.

这样seller_center不需要登陆就完成了单点登陆。

5.CAS实现单点登出的原理

 后续...

6.总结

6.1 CAS是比较成熟的单点登陆解决方案

6.2 CAS性能很差,单台机的并发量只有十几个

6.2 CAS在实际项目的应用中需要做大量的定制开发,需要修改很多源码,会占用开发人员大量的时间和精力。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部