剖析CAS Proxy的设计原理

本文深入剖析了CAS Proxy的工作原理及其配置方法。介绍了CAS Proxy如何帮助应用A代表用户访问其他应用B1和B2,并详细解释了PGT和PT的概念及作用。此外,还提供了具体的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于CAS在开源社区的影响力,它逐渐被应用到各种复杂的SSO环境中。CAS的基本原理在广州UserGroup上有很多文章介绍,我不再做原理性的探讨,但CAS Proxy稍微复杂,值得对其作一个剖析,以便在日后的配置中减少配置上的失误。
1,CAS Proxy的目的
CAS Proxy的目的是,当浏览器用户Peter访问应用A,应用A引用了应用B1, B2的授权性资源(Authorized Resource),应用A想代表Peter去访问应用B1, B2,因此应用A需要告诉应用B1, B2当前用户是谁,以便B1,B2对Peter的Request进行授权。这就是CAS代理(Proxy)。

这种情况很可能出Portal中,比如我在一个Web应用中要求同时从mail.163.com(应用B1),mail.126.com(应用B2)收取邮件并Load入到现在的应用A中去。这种场景中,应用A不可能分别Redirect用户Peter到163.com或者126.com去(因为用户是想要A展示B1,B2的内容,他并不是要访问163,126),只不过B1,B2需要认证才能访问,因此,A承担着这样一个角色,代表用户peter去load B1,B2的邮件。

2,CAS Proxy的执行场景
CAS Proxy协议很准确的描述了这种场景,简单起见,将场景分为两Part:

PartA[获取PGT]:

什么是PGT,PGT就是不需要S,T就能获取到NetID的票据,如果你对票据(Ticket),服务票据
等概念不理解,建议请阅读<Weblogic Security In Action>中篇的Kerberos协议部分。

简单的说,票据(Ticket)就是一张门票,你来看周杰伦的演唱会,你需要门票,那门票叫做
Ticket,本文中的T,周杰伦演唱会就是S(Service)。
你凭什么拿到T,当然不是因为你懂Java,而是因为你是周杰伦的VIP Fans,VIP Fans有VIP卡(即文中的C, Credential,中文翻译叫做凭证),他凭这个C可以拿到票(T),注意,是S Service(周杰伦演唱会)而不是Z Service(李宇春演唱会)或者Y Service (张靓颖演唱会)! 这个T比较巧妙,类似地铁票,CAS将它设计成一次性的票据,周杰伦拿着它给CAS Server一验证,便知道你是谁了(NetID),恩,原来是VIP Fans,欢迎欢迎........
这本来就是CAS基本模式了,本模式还附属了一个PGTURL和PGT(PGTIOU仅仅用于关联作用,忽略),搞清楚PGT和PGTURL,是成功配置CAS Proxy的关键。
PGT的概念(我不敢打比喻了)是,它被应用A用来代理浏览器用户Peter去访问其他更多的应用的凭据。没错,它是一个凭据,你知道,CAS/Kerberos的世界,做任何事情都需要凭据(Ticket)。所以,如果A要做这个代理访问动作,它依赖于PGT,PGT的用法见PartB,这里你知需要明白,PGT是给A用来向B1, B2两个应用证实用户Peter的身份,至于B1,B2怎么做,那还要看Peter的NetID是否具有取B1, B2邮件的权限。

cas_proxy_1.gif


PartB[获取PGT]:

PartB展示了PGT的作用,应用A(下图中的Web application)向CAS Server提交S和PGT,S乃自己的应用标识,PGT最终让A获得PT,PT跟ST的作用一模一样,它也是一次性的票据,A传PT给后端的B1(下图中的Back-end application),B1就可以根据这个PT获得A现在代理的用户Peter的NetID了,如下图所示。
cas_proxy_2.gif


最后,我们比较一下PartA和PartB
PartA,A因为ST获得Peter的NetID
PartB,B1因为PT获得Peter的NetID

谁告诉B1 Peter的NetID, A!Proxy的由来就是这样,A就是CAS Proxy!!

有人问,干嘛这么麻烦,既然PartA中,A已经知道Perter的NetID,为何不直接告诉B1关于Peter的NetID?
理由很简单,SSO依赖于域的一种信任关系,也就是,
1)浏览器用户是不可信的,如果可信,那么认证要来干什么?
2)CAS Server是可信的,如果CAS Server不可信,认证会有结果吗?
3)Web应用可信吗?如果你认为可信,那么你就会问上面那个问题,呵呵。

事实上,在CAS实际环境中,CAS仅仅依赖于信任证书的部署和双向SSL来实现信任关系的建立和核实。应用A和应用B是完全不同的两个应用,他们之间并没有建立信任关系,因此如果A告诉B1, B2关于Peter的NetID, B1,B2也不会相信,B1,B2只信任CAS Server(CAS环境唯一可以信赖的东西,这就是单点登录的前置条件——单点信任),最终,问题仍然需要A向通过CAS Server向B提交一个Peter身世(NetID)的说法。

3, Proxy配置

CAS Client端:
配置Web应用的web.xml使用casclient.jar的两个servlet:

None.gif    < servlet >
None.gif    
< servlet-name > ProxyTicketReceptor </ servlet-name >
None.gif    
< servlet-class > edu.yale.its.tp.cas.proxy.ProxyTicketReceptor </ servlet-class >
None.gif  
</ servlet >
None.gif
None.gif  
< servlet-mapping >
None.gif    
< servlet-name > ProxyTicketReceptor </ servlet-name >
None.gif    
< url-pattern > /CasProxyServlet </ url-pattern >
None.gif  
</ servlet-mapping >

   
另外,在CAS Server端,确保CAS-Server的两个关于Proxy的Servlet能够正常被加载(默认配置即可)。

None.gif      <!--  Proxy (PGT acquisition)  -->
None.gif    
< servlet >
None.gif      
< servlet-name > Proxy </ servlet-name >
None.gif      
< servlet-class > edu.yale.its.tp.cas.servlet.Proxy </ servlet-class >
None.gif    
</ servlet >
None.gif
None.gif    
<!--  Modern proxy-service validation  -->
None.gif    
< servlet >
None.gif      
< servlet-name > ProxyValidate </ servlet-name >
None.gif      
< servlet-class > edu.yale.its.tp.cas.servlet.ProxyValidate </ servlet-class >
None.gif    
</ servlet >

最后一步,先Look一下如何单步调试CAS Proxy的 过程,然后就可以自己编写一个简单的应用A和应用B1,B2来测试CAS Proxy了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值