CAS实现单点登录.docx
- 文档编号:10288845
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:20
- 大小:111.66KB
CAS实现单点登录.docx
《CAS实现单点登录.docx》由会员分享,可在线阅读,更多相关《CAS实现单点登录.docx(20页珍藏版)》请在冰点文库上搜索。
CAS实现单点登录
使用CAS在Tomcat中实现单点登录
分类:
NetworkEngineering J2EE/JavaEE Portal&Portlet CAS&SAML&SSO SpringFramework2008-08-2009:
23 11498人阅读 评论(10) 收藏 举报
单点登录(SingleSignOn,简称SSO)是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
CAS(CentralAuthenticationService)是一款不错的针对Web应用的单点登录框架,本文介绍了CAS的原理、协议、在Tomcat中的配置和使用,对于采用CAS实现轻量级单点登录解决方案的入门读者具有一定指导作用。
CAS介绍
CAS是Yale大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。
CAS具有以下特点:
∙开源的企业级单点登录解决方案。
∙CASServer为需要独立部署的Web应用。
∙CASClient支持非常多的客户端(这里指单点登录系统中的各个Web应用),包括Java,.Net,PHP,Perl,Apache,uPortal,Ruby等。
CAS原理和协议
从结构上看,CAS包含两个部分:
CASServer和CASClient。
CASServer需要独立部署,主要负责对用户的认证工作;CASClient负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CASServer。
图1是CAS最基本的协议过程:
图1.CAS基础协议
CASClient与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源。
对于访问受保护资源的每个Web请求,CASClient会分析该请求的Http请求中是否包含ServiceTicket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的CASServer登录地址,并传递Service(也就是要访问的目的资源地址),以便登录成功过后转回该地址。
用户在第3步中输入认证信息,如果登录成功,CASServer随机产生一个相当长度、唯一、不可伪造的ServiceTicket,并缓存以待将来验证,之后系统自动重定向到Service所在地址,并为客户端浏览器设置一个TicketGrantedCookie(TGC),CASClient在拿到Service和新产生的Ticket过后,在第5,6步中与CASServer进行身份合适,以确保ServiceTicket的合法性。
在该协议中,所有与CAS的交互均采用SSL协议,确保,ST和TGC的安全性。
协议工作过程中会有2次重定向的过程,但是CASClient与CASServer之间进行Ticket验证的过程对于用户是透明的。
另外,CAS协议中还提供了Proxy(代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考CAS官方网站上的相关文档。
准备工作
本文中的例子以tomcat5.5为例进行讲解,下载地址:
http:
//tomcat.apache.org/download-55.cgi
到CAS官方网站下载CASServer和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
回页首
部署CASServer
CASServer是一套基于Java实现的服务,该服务以一个JavaWebApplication单独部署在与servlet2.3兼容的Web服务器上,另外,由于Client与CASServer之间的交互采用Https协议,因此部署CASServer的服务器还需要支持SSL协议。
当SSL配置成功过后,像普通Web应用一样将CASServer部署在服务器上就能正常运行了,不过,在真正使用之前,还需要扩展验证用户的接口。
在Tomcat上部署一个完整的CASServer主要按照以下几个步骤:
配置Tomcat使用Https协议
如果希望Tomcat支持Https,主要的工作是配置SSL协议,其配置过程和配置方法可以参考Tomcat的相关文档。
不过在生成证书的过程中,会有需要用到主机名的地方,CAS建议不要使用IP地址,而要使用机器名或域名。
部署CASServer
CASServer是一个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登录页面,则说明CASServer已经部署成功。
虽然CASServer已经部署成功,但这只是一个缺省的实现,在实际使用的时候,还需要根据实际概况做扩展和定制,最主要的是扩展认证(Authentication)接口和CASServer的界面。
扩展认证接口
CASServer负责完成对用户的认证工作,它会处理登录时的用户凭证(Credentials)信息,用户名/密码对是最常见的凭证信息。
CASServer可能需要到数据库检索一条用户帐号信息,也可能在XML文件中检索用户名/密码,还可能通过LDAPServer获取等,在这种情况下,CAS提供了一种灵活但统一的接口和实现分离的方式,实际使用中CAS采用哪种方式认证是与CAS的基本协议分离开的,用户可以根据认证的接口去定制和扩展。
扩展AuthenticationHandler
CAS提供扩展认证的核心是AuthenticationHandler接口,该接口定义如清单1下:
清单1.AuthenticationHandler定义
publicinterfaceAuthenticationHandler{
/**
*Methodtodetermineifthecredentialssuppliedarevalid.
*@paramcredentialsThecredentialstovalidate.
*@returntrueifvalid,returnfalseotherwise.
*@throwsAuthenticationExceptionAnAuthenticationExceptioncancontain
*detailsaboutwhyaparticularauthenticationrequestfailed.
*/
booleanauthenticate(Credentialscredentials)throwsAuthenticationException;
/**
*Methodtocheckifthehandlerknowshowtohandlethecredentials
*provided.ItmaybeasimplecheckoftheCredentialsclassorsomething
*morecomplicatedsuchasscanningtheinformationcontainedinthe
*Credentialsobject.
*@paramcredentialsThecredentialstocheck.
*@returntrueifthehandlersupportstheCredentials,falseothewrise.
*/
booleansupports(Credentialscredentials);
}
该接口定义了2个需要实现的方法,supports()方法用于检查所给的包含认证信息的Credentials是否受当前AuthenticationHandler支持;而authenticate()方法则担当验证认证信息的任务,这也是需要扩展的主要方法,根据情况与存储合法认证信息的介质进行交互,返回boolean类型的值,true表示验证通过,false表示验证失败。
CAS3中还提供了对AuthenticationHandler接口的一些抽象实现,比如,可能需要在执行authenticate()方法前后执行某些其他操作,那么可以让自己的认证类扩展自清单2中的抽象类:
清单2.AbstractPreAndPostProcessingAuthenticationHandler定义
publicabstractclassAbstractPreAndPostProcessingAuthenticationHandler
implementsAuthenticateHandler{
protectedLoglog=LogFactory.getLog(this.getClass());
protectedbooleanpreAuthenticate(finalCredentialscredentials){
returntrue;
}
protectedbooleanpostAuthenticate(finalCredentialscredentials,
finalbooleanauthenticated){
returnauthenticated;
}
publicfinalbooleanauthenticate(finalCredentialscredentials)
throwsAuthenticationException{
if(!
preAuthenticate(credentials)){
returnfalse;
}
finalbooleanauthenticated=doAuthentication(credentials);
returnpostAuthenticate(credentials,authenticated);
}
protectedabstractbooleandoAuthentication(finalCredentialscredentials)
throwsAuthenticationException;
}
AbstractPreAndPostProcessingAuthenticationHandler类新定义了preAuthenticate()方法和postAuthenticate()方法,而实际的认证工作交由doAuthentication()方法来执行。
因此,如果需要在认证前后执行一些额外的操作,可以分别扩展preAuthenticate()和ppstAuthenticate()方法,而doAuthentication()取代authenticate()成为了子类必须要实现的方法。
由于实际运用中,最常用的是用户名和密码方式的认证,CAS3提供了针对该方式的实现,如清单3所示:
清单3.AbstractUsernamePasswordAuthenticationHandler定义
publicabstractclassAbstractUsernamePasswordAuthenticationHandlerextends
AbstractPreAndPostProcessingAuthenticationHandler{
...
protectedfinalbooleandoAuthentication(finalCredentialscredentials)
throwsAuthenticationException{
returnauthenticateUsernamePasswordInternal((UsernamePasswordCredentials)credentials);
}
protectedabstractbooleanauthenticateUsernamePasswordInternal(
finalUsernamePasswordCredentialscredentials)throwsAuthenticationException;
protectedfinalPasswordEncodergetPasswordEncoder(){
returnthis.passwordEncoder;
}
publicfinalvoidsetPasswordEncoder(finalPasswordEncoderpasswordEncoder){
this.passwordEncoder=passwordEncoder;
}
...
}
基于用户名密码的认证方式可直接扩展自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,MicrosoftSQLServer等均可,这里以DB2作为例子介绍。
并且假设DB2数据库名:
CASTest,数据库登录用户名:
db2user,数据库登录密码:
db2password,用户信息表为:
userTable,该表包含用户名和密码的两个数据项分别为userName和password。
1. 配置 DataStore
打开文件%CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xml,添加一个新的bean标签,对于DB2,内容如清单4所示:
清单4.配置DataStore
db2:
//9.125.65.134:
50000/CASTest
其中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,在文件中可以找到如下一行:
AuthenticationHandler"/>,我们可以将其注释掉,换成我们希望的一个AuthenticationHandler,比如,使用QueryDatabaseAuthenticationHandler或SearchModeSearchDatabaseAuthenticationHandler可以分别选取清单5或清单6的配置。 清单5.使用QueryDatabaseAuthenticationHandler value="selectpasswordfromuserTablewherelower(userName)=lower(? )"/> 清单6.使用SearchModeSearchDatabaseAuthenticationHandler class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler" abstract="false"singleton="true"lazy-init="default" autowire="default"dependency-check="default"> 另外,由于存放在数据库中的密码通常是加密过的,所以AuthenticationHandler在匹配时需要知道使用的加密方法,在deployerConfigContext.xml文件中我们可以为具体的AuthenticationHandler类配置一个property,指定加密器类,比如对于QueryDatabaseAuthenticationHandler,可以修改如清单7所示: 清单7.添加passwordEncoder value="selectpasswordfromuserTablewherelower(userName)=lower(? )"/> 其中myPasswordEncoder是对清单8中设置的实际加密器类的引用: 清单8.指定具体加密器类 class="org.jasig.cas.authentication.handler.MyPasswordEncoder"/> 这里MyPasswordEncoder是根据实际情况自己定义的加密器,实现PasswordEncoder接口及其encode()方法。 3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAS 实现 单点 登录