CAS实现单点登录.docx

上传人:b****1 文档编号:10288845 上传时间:2023-05-24 格式:DOCX 页数:20 大小:111.66KB
下载 相关 举报
CAS实现单点登录.docx_第1页
第1页 / 共20页
CAS实现单点登录.docx_第2页
第2页 / 共20页
CAS实现单点登录.docx_第3页
第3页 / 共20页
CAS实现单点登录.docx_第4页
第4页 / 共20页
CAS实现单点登录.docx_第5页
第5页 / 共20页
CAS实现单点登录.docx_第6页
第6页 / 共20页
CAS实现单点登录.docx_第7页
第7页 / 共20页
CAS实现单点登录.docx_第8页
第8页 / 共20页
CAS实现单点登录.docx_第9页
第9页 / 共20页
CAS实现单点登录.docx_第10页
第10页 / 共20页
CAS实现单点登录.docx_第11页
第11页 / 共20页
CAS实现单点登录.docx_第12页
第12页 / 共20页
CAS实现单点登录.docx_第13页
第13页 / 共20页
CAS实现单点登录.docx_第14页
第14页 / 共20页
CAS实现单点登录.docx_第15页
第15页 / 共20页
CAS实现单点登录.docx_第16页
第16页 / 共20页
CAS实现单点登录.docx_第17页
第17页 / 共20页
CAS实现单点登录.docx_第18页
第18页 / 共20页
CAS实现单点登录.docx_第19页
第19页 / 共20页
CAS实现单点登录.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

CAS实现单点登录.docx

《CAS实现单点登录.docx》由会员分享,可在线阅读,更多相关《CAS实现单点登录.docx(20页珍藏版)》请在冰点文库上搜索。

CAS实现单点登录.docx

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

com.ibm.db2.jcc.DB2Driver

jdbc:

db2:

//9.125.65.134:

50000/CASTest

db2user

db2password

其中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">

userTable

userName

password

另外,由于存放在数据库中的密码通常是加密过的,所以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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2