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
这样就完成了整个过程
分享到:
相关推荐
将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.
AceGI安全策略与CAS(Central Authentication Service)整合是企业级应用中常见的安全解决方案,它能够为Web应用程序提供统一的身份验证和授权服务。本文档旨在详细阐述这一整合过程,包括配置步骤、所需资源以及...
将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.
标题和描述均提到了“Acegi Security整合CAS实例”,这涉及到Spring Framework下的Acegi Security模块与CAS(Central Authentication Service)的集成。Acegi Security是Spring框架的一个子项目,旨在为应用提供安全...
将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.
AceGI(Authentication and Credentials Engine...通过这个示例,开发者可以学习到如何在自己的应用中整合AceGI和CAS,提高应用的安全性和用户体验。这不仅简化了用户的登录流程,同时也让安全管理变得更加集中和高效。
Acegi Security 和 CAS 在 Java Web 开发中的应用 Acegi Security 是一个早期的、非常流行的 Java 安全...了解 Acegi Security 与 CAS 的整合,有助于开发者掌握如何在不破坏用户体验的情况下,有效地实施安全性策略。
Acegi Security与CAS的整合使得应用可以利用CAS服务器进行集中式的用户身份验证。当用户尝试访问受保护的资源时,如果未经过认证,会被重定向到CAS服务器进行登录。成功认证后,CAS服务器会返回一个票据(ticket),...
Acegi安全框架通过一系列关键组件来实现这些功能,同时它还具备高度的灵活性,可以与各种认证机制(如容器认证、CASSSO、X509等)进行整合,以适应不同的应用场景。 #### Acegi的关键组件 Acegi安全系统由多个关键...
acegi-security-sample-contacts-cas.war security 中 与 cas 整合的一个例子 但具体的还没看
该系统采用CAS单点登录技术、Acegi安全框架、MySQL和Oracle数据库、S2SH框架等技术,实现了学院各部门信息的整合,提高了师生获取信息的效率和安全性。 CAS单点登录技术 CAS(Central Authentication Service)是...
- **背景:** Spring Security 的前身是 Acegi 安全框架,后来被 Spring 社区采纳并重新命名为 Spring Security。 - **发展:** 经过多个版本的迭代,Spring Security 已经成为 Spring 生态系统中最成熟的安全解决...
Spring Security 的前身是 Acegi 安全框架,后来被整合进 Spring 框架中,并更名为 Spring Security。从 3.0 版本开始,Spring Security 进行了大量的重构和改进,以更好地适应现代 Web 应用的安全需求。 **特点:*...