- 浏览: 42785 次
- 性别:
- 来自: 上海
最新评论
-
pengtyao:
兄弟能传一份word原始版到附件么,谢谢
jira插件开发学习 -
suifeng:
多谢, 藏之.
Oracle8i中使用Java语言来开发存储过程 -
wzpwork:
谢谢楼主,我也写了一个这样的爬虫,但被阿里给终止了,直接返回找 ...
使用htmlparser抓取阿里巴巴上宁波企业的详细资料 -
leeqianjun:
网络爬虫web Harvest 比较不错,扩展性非常好,只不过 ...
使用htmlparser抓取阿里巴巴上宁波企业的详细资料 -
sdh5724:
最受不了的是写爬虫。 不控制速度的程序员。 每天系统要自动屏蔽 ...
使用htmlparser抓取阿里巴巴上宁波企业的详细资料
使用 CAS 在 Tomcat 中实现单点登录 |
级别: 初级 张 涛 (zzhangt@cn.ibm.com), 软件工程师, IBM 2008 年 4 月 10 日 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架,本文介绍了 CAS 的原理、协议、在 Tomcat 中的配置和使用,对于采用 CAS 实现轻量级单点登录解决方案的入门读者具有一定指导作用。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--> CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程: 图 1. CAS 基础协议 CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。 在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。 另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。 本文中的例子以 tomcat5.5 为例进行讲解,下载地址: http://tomcat.apache.org/download-55.cgi 到 CAS 官方网站下载 CAS Server 和 Client,地址分别为: http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip
CAS Server 是一套基于 Java 实现的服务,该服务以一个 Java Web Application 单独部署在与 servlet2.3 兼容的 Web 服务器上,另外,由于 Client 与 CAS Server 之间的交互采用 Https 协议,因此部署 CAS Server 的服务器还需要支持 SSL 协议。当 SSL 配置成功过后,像普通 Web 应用一样将 CAS Server 部署在服务器上就能正常运行了,不过,在真正使用之前,还需要扩展验证用户的接口。 在 Tomcat 上部署一个完整的 CAS Server 主要按照以下几个步骤: 如果希望 Tomcat 支持 Https,主要的工作是配置 SSL 协议,其配置过程和配置方法可以参考 Tomcat 的相关文档。不过在生成证书的过程中,会有需要用到主机名的地方,CAS 建议不要使用 IP 地址,而要使用机器名或域名。 CAS Server 是一个 Web 应用包,将前面下载的 cas-server-3.1.1-release.zip 解开,把其中的 cas-server-webapp-3.1.1.war 拷贝到 tomcat的 webapps 目录,并更名为 cas.war。由于前面已配置好 tomcat 的 https 协议,可以重新启动 tomcat,然后访问:https://localhost:8443/cas ,如果能出现正常的 CAS 登录页面,则说明 CAS Server 已经部署成功。 虽然 CAS Server 已经部署成功,但这只是一个缺省的实现,在实际使用的时候,还需要根据实际概况做扩展和定制,最主要的是扩展认证 (Authentication) 接口和 CAS Server 的界面。 CAS Server 负责完成对用户的认证工作,它会处理登录时的用户凭证 (Credentials) 信息,用户名/密码对是最常见的凭证信息。CAS Server 可能需要到数据库检索一条用户帐号信息,也可能在 XML 文件中检索用户名/密码,还可能通过 LDAP Server 获取等,在这种情况下,CAS 提供了一种灵活但统一的接口和实现分离的方式,实际使用中 CAS 采用哪种方式认证是与 CAS 的基本协议分离开的,用户可以根据认证的接口去定制和扩展。 扩展 AuthenticationHandler CAS 提供扩展认证的核心是 AuthenticationHandler 接口,该接口定义如清单 1 下: 清单 1. AuthenticationHandler定义
该接口定义了 2 个需要实现的方法,supports ()方法用于检查所给的包含认证信息的Credentials 是否受当前 AuthenticationHandler 支持;而 authenticate() 方法则担当验证认证信息的任务,这也是需要扩展的主要方法,根据情况与存储合法认证信息的介质进行交互,返回 boolean 类型的值,true 表示验证通过,false 表示验证失败。 CAS3中还提供了对AuthenticationHandler 接口的一些抽象实现,比如,可能需要在执行authenticate() 方法前后执行某些其他操作,那么可以让自己的认证类扩展自清单 2 中的抽象类: 清单 2. AbstractPreAndPostProcessingAuthenticationHandler定义
AbstractPreAndPostProcessingAuthenticationHandler 类新定义了 preAuthenticate() 方法和 postAuthenticate() 方法,而实际的认证工作交由 doAuthentication() 方法来执行。因此,如果需要在认证前后执行一些额外的操作,可以分别扩展 preAuthenticate()和 ppstAuthenticate() 方法,而 doAuthentication() 取代 authenticate() 成为了子类必须要实现的方法。 由于实际运用中,最常用的是用户名和密码方式的认证,CAS3 提供了针对该方式的实现,如清单 3 所示: 清单 3. AbstractUsernamePasswordAuthenticationHandler 定义
基于用户名密码的认证方式可直接扩展自 AbstractUsernamePasswordAuthenticationHandler,验证用户名密码的具体操作通过实现 authenticateUsernamePasswordInternal() 方法达到,另外,通常情况下密码会是加密过的,setPasswordEncoder() 方法就是用于指定适当的加密器。 从以上清单中可以看到,doAuthentication() 方法的参数是 Credentials 类型,这是包含用户认证信息的一个接口,对于用户名密码类型的认证信息,可以直接使用 UsernamePasswordCredentials,如果需要扩展其他类型的认证信息,需要实现Credentials接口,并且实现相应的 CredentialsToPrincipalResolver 接口,其具体方法可以借鉴 UsernamePasswordCredentials 和 UsernamePasswordCredentialsToPrincipalResolver。 JDBC 认证方法 用户的认证信息通常保存在数据库中,因此本文就选用这种情况来介绍。将前面下载的 cas-server-3.1.1-release.zip 包解开后,在 modules 目录下可以找到包 cas-server-support-jdbc-3.1.1.jar,其提供了通过 JDBC 连接数据库进行验证的缺省实现,基于该包的支持,我们只需要做一些配置工作即可实现 JDBC 认证。 JDBC 认证方法支持多种数据库,DB2, Oracle, MySql, Microsoft SQL Server 等均可,这里以 DB2 作为例子介绍。并且假设DB2数据库名: CASTest,数据库登录用户名: db2user,数据库登录密码: db2password,用户信息表为: userTable,该表包含用户名和密码的两个数据项分别为 userName 和 password。 1. 配置 DataStore 打开文件 %CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xml,添加一个新的 bean 标签,对于 DB2,内容如清单 4 所示: 清单 4. 配置 DataStore
其中 id 属性为该 DataStore 的标识,在后面配置 AuthenticationHandler 会被引用,另外,需要提供 DataStore 所必需的数据库驱动程序、连接地址、数据库登录用户名以及登录密码。 2. 配置 AuthenticationHandler 在 cas-server-support-jdbc-3.1.1.jar 包中,提供了 3 个基于 JDBC 的 AuthenticationHandler,分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其中 BindModeSearchDatabaseAuthenticationHandler 是用所给的用户名和密码去建立数据库连接,根据连接建立是否成功来判断验证成功与否;QueryDatabaseAuthenticationHandler 通过配置一个 SQL 语句查出密码,与所给密码匹配;SearchModeSearchDatabaseAuthenticationHandler 通过配置存放用户验证信息的表、用户名字段和密码字段,构造查询语句来验证。 使用哪个 AuthenticationHandler,需要在 deployerConfigContext.xml 中设置,默认情况下,CAS 使用一个简单的 username=password 的 AuthenticationHandler,在文件中可以找到如下一行:<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePassword 清单 5. 使用 QueryDatabaseAuthenticationHandler
清单 6. 使用 SearchModeSearchDatabaseAuthenticationHandler
另外,由于存放在数据库中的密码通常是加密过的,所以 AuthenticationHandler 在匹配时需要知道使用的加密方法,在 deployerConfigContext.xml 文件中我们可以为具体的 AuthenticationHandler 类配置一个 property,指定加密器类,比如对于 QueryDatabaseAuthenticationHandler,可以修改如清单7所示: 清单 7. 添加 passwordEncoder
其中 myPasswordEncoder 是对清单 8 中设置的实际加密器类的引用: 清单 8. 指定具体加密器类
这里 MyPasswordEncoder 是根据实际情况自己定义的加密器,实现 PasswordEncoder 接口及其 encode() 方法。 3. 部署依赖包 在以上配置完成以后,需要拷贝几个依赖的包到 cas 应用下,包括:
CAS 提供了 2 套默认的页面,分别为“ default ”和“ simple ”,分别在目录“ cas/WEB-INF/view/jsp/default ”和“ cas/WEB-INF/view/jsp/simple ”下。其中 default 是一个稍微复杂一些的页面,使用 CSS,而 simple 则是能让 CAS 正常工作的最简化的页面。 在部署 CAS 之前,我们可能需要定制一套新的 CAS Server 页面,添加一些个性化的内容。最简单的方法就是拷贝一份 default 或 simple 文件到“ cas/WEB-INF/view/jsp ”目录下,比如命名为 newUI,接下来是实现和修改必要的页面,有 4 个页面是必须的:
CAS 的页面采用 Spring 框架编写,对于不熟悉 Spring 的使用者,在修改之前需要熟悉该框架。 页面定制完过后,还需要做一些配置从而让 CAS 找到新的页面,拷贝“ cas/WEB-INF/classes/default_views.properties ”,重命名为“ cas/WEB-INF/classes/ newUI_views.properties ”,并修改其中所有的值到相应新页面。最后是更新“ cas/WEB-INF/cas-servlet.xml ”文件中的 viewResolver,将其修改为如清单 9 中的内容。 清单 9. 指定 CAS 页面
单点登录的目的是为了让多个相关联的应用使用相同的登录过程,本文在讲解过程中构造 2个简单的应用,分别以 casTest1 和 casTest2 来作为示例,它们均只有一个页面,显示欢迎信息和当前登录用户名。这 2 个应用使用同一套登录信息,并且只有登录过的用户才能访问,通过本文的配置,实现单点登录,即只需登录一次就可以访问这两个应用。 假设 CAS Server 单独部署在一台机器 A,而客户端应用部署在机器 B 上,由于客户端应用与 CAS Server 的通信采用 SSL,因此,需要在 A 与 B 的 JRE 之间建立信任关系。 首先与 A 机器一样,要生成 B 机器上的证书,配置 Tomcat 的 SSL 协议。其次,下载http://blogs.sun.com/andreas/entry/no_more_unable_to_find 的 InstallCert.java,运行“ java InstallCert compA:8443 ”命令,并且在接下来出现的询问中输入 1。这样,就将 A 添加到了 B 的 trust store 中。如果多个客户端应用分别部署在不同机器上,那么每个机器都需要与 CAS Server 所在机器建立信任关系。 准备好应用 casTest1 和 casTest2 过后,分别部署在 B 和 C 机器上,由于 casTest1 和casTest2,B 和 C 完全等同,我们以 casTest1 在 B 机器上的配置做介绍,假设 A 和 B 的域名分别为 domainA 和 domainB。 将 cas-client-java-2.1.1.zip 改名为 cas-client-java-2.1.1.jar 并拷贝到 casTest1/WEB-INF/lib目录下,修改 web.xml 文件,添加 CAS Filter,如清单 10 所示: 清单 10. 添加 CAS Filter
对于所有访问满足 casTest1/protected-pattern/ 路径的资源时,都要求到 CAS Server 登录,如果需要整个 casTest1 均受保护,可以将 url-pattern 指定为“/*”。 从清单 10 可以看到,我们可以为 CASFilter 指定一些参数,并且有些是必须的,表格 1 和表格 2 中分别是必需和可选的参数: 表格 1. CASFilter 必需的参数
表格 2. CASFilter 可选参数
CAS 在登录成功过后,会给浏览器回传 Cookie,设置新的到的 Service Ticket。但客户端应用拥有各自的 Session,我们要怎么在各个应用中获取当前登录用户的用户名呢?CAS Client 的 Filter 已经做好了处理,在登录成功后,就可以直接从 Session 的属性中获取,如清单 11 所示: 清单 11. 在 Java 中通过 Session 获取登录用户名
在 JSTL 中获取用户名的方法如清单 12 所示: 清单 12. 通过 JSTL 获取登录用户名
另外,CAS 提供了一个 CASFilterRequestWrapper 类,该类继承自HttpServletRequestWrapper,主要是重写了 getRemoteUser() 方法,只要在前面配置 CASFilter 的时候为其设置“ edu.yale.its.tp.cas.client.filter.wrapRequest ”参数为 true,就可以通过 getRemoteUser() 方法来获取登录用户名,具体方法如清单 13 所示: 清单 13. 通过 CASFilterRequestWrapper 获取登录用户名
在 casTest1 和 casTest2 中,都有一个简单 Servlet 作为欢迎页面 WelcomPage,且该页面必须登录过后才能访问,页面代码如清单 14 所示: 清单 14. WelcomePage 页面代码
在上面所有配置结束过后,分别在 A, B, C上启动 cas, casTest1 和 casTest2,按照下面步骤来访问 casTest1 和 casTest2:
图 2. CAS 登录页面
图 3. 登录后访问 casTest1 的效果 可以看到图 中地址栏里的地址多出了一个 ticket 参数,这就是 CAS 分配给当前应用的 ST(Service Ticket)。
图 4. 在 casTest1 中登录过后访问 casTest2 的效果
本文介绍了 CAS 单点登录解决方案的原理,并结合实例讲解了在 Tomcat 中使用 CAS 的配置、部署方法以及效果。CAS 是作为开源单点登录解决方案的一个不错选择,更多的使用细节可以参考 CAS 官方网站。
|
发表评论
-
使用htmlparser抓取阿里巴巴上宁波企业的详细资料
2008-11-07 21:30 5080最近无聊,写个小程序抓取阿里巴巴企业的详细信息,用h ... -
结合Apache和Tomcat实现集群和负载均衡
2008-11-02 10:53 2084本文基本参考自 轻松实现Apache,Tomcat集群和负载均 ... -
Oracle8i中使用Java语言来开发存储过程
2008-11-02 10:49 1749在Oracle8i之前,开发人 ... -
Hibernate3调用存储过程用法
2008-11-02 10:43 2591直接以一个例子在说明,如DB2中有一个简单存储过程 selec ... -
Lucene 索引数据库
2008-10-30 16:49 1386Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索, ... -
2008年中 My Favorite Java Site
2008-10-29 12:56 10102008年中 My Favorite Java Site ... -
Maven的基本原理和Maven2的新特性
2007-09-06 14:00 4977用Maven做项目管理 在Java世界中我们很多的开发人员选择 ... -
maven的使用
2007-09-06 11:36 1851一、前言 早就知道maven 在java 项目 ... -
使用Maven管理Eclipse Java项目(转载)
2007-09-06 09:44 2487为什么要使用Maven,使用Maven有什么好处 maven ...
相关推荐
使用 CAS 在 Tomcat 中实现单点登录
CAS 在 Tomcat 中实现单点登录
单点登录(SSO)是现代企业环境中一种高效的身份验证机制,它允许用户在一个系统中登录后,无需再次输入凭证即可访问多个相互信任的应用系统。CAS(Central Authentication Service)是SSO的一种实现,由Yale大学...
### 使用CAS在Tomcat中实现单点登录的关键知识点 #### 一、CAS简介与特性 - **CAS**(Central Authentication Service)是由耶鲁大学发起的一个开源项目,它为Web应用程序提供了一种简单可靠且功能强大的单点登录...
总结来说,实现使用CAS在Tomcat6中进行单点登录,需要理解SSO的基本概念,熟悉CAS的工作原理和协议流程,掌握CAS Server的部署和配置,以及CAS Client在Tomcat中的集成。通过这些步骤,可以构建一个安全且方便的单点...
2. **应用服务器配置**:在Tomcat中,你需要配置每个应用以信任CAS服务器。这通常通过修改应用的`web.xml`文件实现,添加CAS过滤器和监听器,配置CAS服务URL和服务验证URL。 3. **安全证书**:CAS服务器通常需要SSL...
本文将详细介绍如何使用CAS整合CXF,实现基于Tomcat服务器的单点登录部署步骤。 首先,我们需要在Tomcat服务器上部署CAS项目。这通常涉及以下步骤: 1. **下载CAS服务器**:从官方Git仓库或Maven仓库获取最新的CAS...
Tomcat 下用cas实现单点登录,实现系统整合。
在Tomcat中集成CAS单点登录,可以极大地提升应用系统的安全性与用户体验。具体操作涉及下载和配置CAS服务器,修改Tomcat应用的配置,以及正确处理票证验证。这个过程可能涉及到一些复杂性,但通过详细的文档和正确的...
【标题】"CAS Tomcat整合单点登录Demo"是一个示例项目,展示了如何将CAS(Central Authentication Service)与Tomcat应用程序服务器集成,实现单点登录(Single Sign-On, SSO)的功能。CAS是一种开放源码的身份验证...
3. 系统集成:cas 单点登录解决方案需要与不同的应用系统集成,以便用户可以使用单点登录访问所有相互信任的应用系统。 cas 单点登录解决方案可以带来许多好处,但是也存在一些挑战和限制。例如,cas 单点登录解决...
4. 集成 CAS 和 Windows AD:使用 SPN 和 keytab 文件将 CAS 与 Windows AD 集成,实现单点登录免身份认证。 CAS 和 Windows AD 集成 集成 CAS 和 Windows AD 需要使用 SPN(Service Principal Name)和 keytab ...
`cas-shiro-demo-app` 是一个包含CAS和Shiro整合的示例应用,用于演示如何在实际项目中实现单点登录。这个示例可能包含以下组件: 1. **CAS服务器**:部署并配置CAS服务器,处理用户登录和票证验证。 2. **应用...
《Tomcat中使用Yale+CAS实现单点登陆(SSO).doc》可能会讲解如何结合Yale大学提供的CAS实现SSO。《修改CAS客户端.pdf》可能是关于如何自定义和扩展CAS客户端的指导。最后,《构造CAS客户端的登录Servlet.pdf》则可能...
本压缩包"集成cas实现单点登录认证.zip"显然包含了关于如何使用CAS(Central Authentication Service)框架集成SSO认证的资源。下面我们将详细探讨相关的知识点。 1. CAS简介:CAS是耶鲁大学开源的一个Web应用的...
cas-server-3.3.1-release.zip服务器端所有资源包 cas-client-java-2.1.1.zip客户端源码包 casclient-2.1.1.jar客户端JAR包 说明.doc,完整的说明帮助文档
【单点登录(SSO)】单点登录(Single Sign-On,简称SSO)是一种让用户在访问多个相互信任的应用系统时只需登录一次的技术。它提高了用户体验,减少了因反复登录带来的不便,同时也强化了系统的安全性。SSO的核心...
- "使用 CAS 在 Tomcat 中实现单点登录_1.pdf":这份文档应该详细介绍了如何在Tomcat上集成CAS,包括下载CAS服务器,配置服务提供者,以及客户端的安装和配置。 - "跨域SSO实例安装和配置指南_3.pdf":此文件可能...
单点登录(Single Sign-On,简称SSO)是一种网络访问控制机制,允许用户在一次登录后,无需再次认证即可访问多个相互信任的应用系统。CAS(Central Authentication Service)是耶鲁大学开发的一个开源SSO项目,它...