心情小站
勤学、勤思
BlogJava
首页
新随笔
联系
聚合
管理
posts - 193, comments - 520, trackbacks - 0
acegi整合CAS
acegi内置了对CAS的支持。这里的CAS是3.0。建立CAS server是一个比较简单的事情。CAS server就是一个标准的war文件,把它发布就可以运行。需要做的仅仅是调整登陆和其他一些页面。先了解一下CAS如何实现SSO。
例子:原有系统A和系统B,现在在它们之间做SSO。
很显然,系统A和B都是CAS client。首先是访问系统A,干掉A的登陆页面,在A的入口判断有没有Ticket(票据),如果没有则重定向到CAS server,在CAS server提供Credential(大多数情况就是用户名和密码)。CAS server的作用非常简单:就是来验证用户密码。正确,则发送Ticket。CAS有5种Ticket,分别是TGC(通过cookie发送的ticket),ST(Service Ticket),PGT,PGTIOU,PT。其中PGT,PGTIOU,PT属于代理ticket,这里不作讨论。具体可以参考
http://www.blogjava.net/openssl/archive/2006/04/26/SSO_CASProxy.html
TGC和ST的关系可以打个比方:
我去中央电视塔去玩,结果发现地下还有个海底世界。SSO前我是这么玩的:先去电视塔买张门票,玩完了;再去海底世界买张门票,玩完了。发现真累,两个景点这么近还要买两次门票,就不能搞个通票吗?于是就SSO。于是这样:我先去电视塔,门卫告诉我你不能进去要买票,于是把我送到通票售票处(CAS server)买票(登录),买吧,于是给了我两张票,注意,是两张,一张发到我手里,上面写着仅限电视塔使用(ST);靠,不是通票吗,咋仅限电视塔使用?别急,还有一张票(TGC)通过cookie发送你看不见。人家说了保证没问题,我咋办,这是人家的规矩,那就先去玩吧。出了电视塔我直扑海底世界,
门卫说要海底世界票,不会吧,我买的通票啊,门卫说不着急,又把我送回通票售票处(CAS server),通票售票处(CAS server)一看,发现我有TGC,嘿嘿,这家伙买过票了不用再买(不用再登录),于是换我一张票(ST)上面写着仅限海底世界使用,于是我就拿着这张票又去海底世界了。于是我明白了啥是SSO了,不就是把买票改成换票了吗?
比方完了,最开始的例子也就不往下继续了。需要注意的是系统A和B整合SSO需要把A、B的用户密码集中管理,你说A中我的用户名是张三,B中是李四,SSO能不能帮我自动识别,回答是不行的。
继续Acegi的整合。
CAS server是做用户密码验证,具体的权限授权的工作还是在各个单个系统里,也不应该交给它管。做用户密码验证需要AuthenticationHandler。这个具体就是根据Credential返回一个boolean值来判断你输入的用户密码正不正确。acegi提供了一个实现。
以一个典型的web访问来说明整个过程
1、用户访问一个受acegi安全保护的页面或业务方法;
2、用户没有登陆的话显然会抛出AuthenticationException
3、配置exceptionTranslationFilter捕获这个异常重定向到CAS server登陆页面
<
bean
id
="exceptionTranslationFilter"
class
="org.acegisecurity.ui.ExceptionTranslationFilter"
>
<
property
name
="authenticationEntryPoint"
><
ref
local
="casProcessingFilterEntryPoint"
/></
property
>
</
bean
>
<
bean
id
="casProcessingFilterEntryPoint"
class
="org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint"
>
<
property
name
="loginUrl"
><
value
>
https://my.company.com/cas/login
</
value
></
property
>
<
property
name
="serviceProperties"
><
ref
local
="serviceProperties"
/></
property
>
</
bean
>
<
bean
id
="serviceProperties"
class
="org.acegisecurity.ui.cas.ServiceProperties"
>
<
property
name
="service"
><
value
>
https://server.company.com/myapp/j_acegi_cas_security_check
</
value
></
property
>
<
property
name
="sendRenew"
><
value
>
false
</
value
></
property
>
</
bean
>
serviceProperties里的service属性即在CAS server登陆完毕后由CAS server重定向回来的页面
https://my.company.com/cas/login?service=https%3A%2F%2Fserver.company.com%2Fmyapp%2Fj_acegi_cas_security_check
4、CAS server检查是否有TGC ,没有则登陆,登陆后返回。这里屁股后面跟着的即ST,TGC通过cookie一并发送到客户端。
https://server.company.com/myapp/j_acegi_cas_security_check?ticket=ST-0-jhsdfguwgeds
5、配置casProcessingFilter来处理返回ST(和以前的authenticationProcessingFilter比较类似)
<
bean
id
="casProcessingFilter"
class
="org.acegisecurity.ui.cas.CasProcessingFilter"
>
<
property
name
="authenticationManager"
><
ref
local
="authenticationManager"
/></
property
>
<
property
name
="authenticationFailureUrl"
><
value
>
/casfailed.jsp
</
value
></
property
>
<
property
name
="defaultTargetUrl"
><
value
>
/
</
value
></
property
>
<
property
name
="filterProcessesUrl"
><
value
>
/j_acegi_cas_security_check
</
value
></
property
>
</
bean
>
6、配置authenticationManager
<
bean
id
="authenticationManager"
class
="org.acegisecurity.providers.ProviderManager"
>
<
property
name
="providers"
>
<
list
>
<
ref
local
="casAuthenticationProvider"
/>
</
list
>
</
property
>
</
bean
>
<
bean
id
="casAuthenticationProvider"
class
="org.acegisecurity.providers.cas.CasAuthenticationProvider"
>
<
property
name
="casAuthoritiesPopulator"
><
ref
local
="casAuthoritiesPopulator"
/></
property
>
<
property
name
="casProxyDecider"
><
ref
local
="casProxyDecider"
/></
property
>
<
property
name
="ticketValidator"
><
ref
local
="casProxyTicketValidator"
/></
property
>
<
property
name
="statelessTicketCache"
><
ref
local
="statelessTicketCache"
/></
property
>
<
property
name
="key"
><
value
>
my_password_for_this_auth_provider_only
</
value
></
property
>
</
bean
>
具体作用的是casAuthenticationProvider,casAuthenticationProvider通过 casProxyTicketValidator来校验ST
<
bean
id
="casProxyTicketValidator"
class
="org.acegisecurity.providers.cas.ticketvalidator.CasProxyTicketValidator"
>
<
property
name
="casValidate"
><
value
>
https://my.company.com/cas/proxyValidate
</
value
></
property
>
<
property
name
="serviceProperties"
><
ref
local
="serviceProperties"
/></
property
>
</
bean
>
casProxyTicketValidator又具体实现调用了CAS Client library里的ProxyTicketValidator校验ST,ProxyTicketValidator 就比较有意思了,它做了个HTTPS请求CAS server,结果还是CAS server来校验ST(绕了一大圈)
https://my.company.com/cas/proxyValidate?service=https%3A%2F%2Fserver.company.com%2Fmyapp%2Fj_acegi_cas_security_check
重新回到CAS server,它接受到这个HTTPS请求,检查ST是否与对这个service发行的ST吻合,吻合的话CAS server就会发回一个肯定的XML回复,里面包含了用户名(username)。剩下的就EASY了,casProxyTicketValidator解析XML,casProxyDecider处理代理,casAuthoritiesPopulator根据解析后的XML获得user,最后就是casAuthenticationProvider构造Authentication(这里是CasAuthenticationToken)
7、重新回到casProcessingFilter,它将Authentication放入HttpSession
这样就完成了整个过程
http://www.blogjava.net/ronghao 荣浩原创,转载请注明出处:)
posted on 2006-08-29 12:31
ronghao
阅读(6253)
评论(5)
编辑
收藏
所属分类:
权限相关
FeedBack:
#
re: acegi整合CAS
2006-08-29 14:33 |
BlueDavy
呵呵,那段海底世界的写的很形象,好文....
回复
更多评论
#
re: acegi整合CAS
2006-08-29 23:43 |
ronghao
呵呵,谢谢.你的OSGI系列让我感到如果不学OSGI就会被淘汰了:)压力好大啊
回复
更多评论
#
re: acegi整合CAS
2006-09-08 17:24 |
严
倒~~~,兄弟你怎么不早写一个月,我花了很多时间才研究明白这东西。
回复
更多评论
#
re: acegi整合CAS
2008-04-30 10:53 |
JS
cas2 可以用server授权
回复
更多评论
#
re: acegi整合CAS
2010-03-03 10:42 |
阿法
我的QQ:524386747
交个朋友!
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
关于权限系统设计的一些问与答
对数据权限控制的实验
对权限系统设计的再思考
Acegi ACL使用说明
对权限分类的补遗
权限系统功能说明
对Acegi ACL扩展的构想
acegi整合CAS
agegi整合小经验
乱弹权限系统续二
<
2006年8月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
关注工作流和企业业务流程改进。现就职于ThoughtWorks。新浪微博:
http://weibo.com/ronghao100
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(38)
给我留言
查看公开留言
查看私人留言
随笔分类
ajax相关(9)
cms(7)
Head First Process-深入浅出流程(15)
j2se基础(6)
JbpmSide(6)
OOA/OOD(4)
SOA、BPM(26)
工作日志(24)
工作流jbpm3(10)
张小庆,在路上(42)
心情小站(24)
权限相关(12)
表现层相关(4)
转载(4)
随笔档案
2013年8月 (1)
2012年12月 (1)
2012年1月 (3)
2011年12月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (3)
2011年8月 (7)
2011年7月 (4)
2011年6月 (3)
2011年5月 (5)
2011年4月 (6)
2011年3月 (4)
2011年2月 (2)
2010年9月 (1)
2010年6月 (1)
2010年5月 (1)
2010年3月 (4)
2010年1月 (2)
2009年11月 (5)
2009年10月 (4)
2009年9月 (1)
2009年7月 (1)
2009年6月 (2)
2009年5月 (2)
2009年4月 (1)
2009年3月 (4)
2009年2月 (2)
2008年12月 (1)
2008年11月 (1)
2008年10月 (1)
2008年9月 (2)
2008年8月 (2)
2008年7月 (2)
2008年6月 (3)
2008年5月 (4)
2008年4月 (1)
2008年3月 (2)
2008年2月 (2)
2008年1月 (4)
2007年11月 (3)
2007年10月 (3)
2007年9月 (2)
2007年8月 (4)
2007年7月 (1)
2007年6月 (12)
2007年5月 (2)
2007年4月 (1)
2007年3月 (8)
2007年2月 (6)
2007年1月 (4)
2006年12月 (4)
2006年11月 (3)
2006年10月 (1)
2006年8月 (2)
2006年7月 (3)
2006年6月 (3)
2006年4月 (1)
2006年3月 (2)
2006年2月 (2)
2006年1月 (4)
2005年12月 (7)
2005年11月 (12)
文章分类
Hibernate3
JSP标签
工作流jbpm3(2)
文章档案
2005年11月 (2)
常去的网站
JavaEye
JAVA研究组织
开源大全
搜索
最新评论
1. re: 使用Handler来增强Web服务的功能
asdfasfd
--ads
2. re: 使用solr搭建你的全文检索
@木哥哥
你的分词器用的是什么啊?mmseg貌似可以的
--陈冠驰
3. re: 使用solr搭建你的全文检索
@marten这是你的solr的schame.xml配置文件有问题。好好检查下你的配置文件里面的字段什么的配置对着没
--陈冠驰
4. re: 讨论一下你觉得一个工作流产品好的标准
评论内容较长,点击标题查看
--深圳非凡信息技术有限公司
5. re: DisplayTag应用
name="test"从哪里来的,千篇一律的到处使用test却没有test的定义,sb
--qige
阅读排行榜
1. 使用solr搭建你的全文检索(67309)
2. 工作流开发小结(10122)
3. 结合spring+hibernate与jdbc的事务(7736)
4. jBPM4与Spring的集成(7361)
5. ibatis DAO 事务探索(7209)
评论排行榜
1. 什么是JAVA内容仓库(Java Content Repository)(2)(25)
2. DisplayTag应用(25)
3. 高并发测试下的一些问题及解决(22)
4. 使用solr搭建你的全文检索(14)
5. 开始开发CMS(12)