单点登录实现步骤:
一.SSO CAS 简单介绍
SSO,即Single sign on/off,单点登录/退出。
单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决
之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架,本文介绍了 CAS 的原理、
、在 Tomcat 中的配置和使用。
CAS 介绍:
CAS,全称JA-SIG Central Authentication Service,实现SSO的开源项目。
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
· 开源的企业级单点登录解决方案。
· CAS Server 为需要独立部署的 Web 应用。
· CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
CAS 原理和协议:
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:
图 1. CAS 基础协议
二:实现步骤:
环境:
Windows XP JDK1.6 Tomcat6.0
准备1:
安装JDK,myEclipse或eclipse,tomcat
准备2:
到CAS官方站点下载CAS的客户端和服务器端
官方地址为:http://www.ja-sig.org/products/cas/
下载页面为:http://www.ja-sig.org/products/cas/downloads/index.html
到下载页面下载以下3个zip包:
第一个,CAS Server,这个是CAS的服务器端(当前最新版本是3.3.1)
第二个,JA-SIGCAS Java Client,这个是官方开发的CAS的客户端,用于单点退出。特别注意事项:当前只有这个客户端(JA-SIGCAS Java Client)的3.1.2及以上版本支持单点退出(当前最新版本是3.1.3)
第三个,Yale CAS Client,这个是耶鲁大学开发的CAS的客户端,用于单点登录,不支持单点退出(当前最新版本是2.0.11)
下载后的ZIP包安放于c:\resource\cas目录下,分别解压于当前目录。
准备工作结束,开始正式操作。
步骤1:制作密钥
开始-运行-CMD
先测试一下,键入:(键入尖括号右面的代码。尖括号不要键入,下同)
>keytool 或者 > D:\Java\jdk1.6.0_16\bin\keytool (这里的路径按照自己的实际路径操作)
如果没有出现帮助说明,说明Path没有配置,请到环境变量中自行配置。
配置好了重新打开CMD窗口,转到c:\resource\cas目录下。
>c:
>cd\
>cd resource\cas
1:生成证书,键入:
>keytool -genkey -alias tomcat -keystore ./mykeystore -keyalg RSA -validity 2000
说明:
这里-alias tomcat
示生成的这个证书的别名叫tomcat;-keyalg RSA指的是采用的RSA算法;-keystore ./mykeystore 指生成的证书存储的位置(c:\resource/cas);回车后会提示你输入keystore password,这可以自己定(这里输入changeit(默认的,我没改,当然你也可以随意设置),下面配置tomcat时要用的),密码输入后,会让你输入其他信息,在开始问“您的名字与姓氏是什么?”的时候,必须填写你服务器所在域名(在局域网中测试时,使用主机名或hosts文件中注册的域名,本机可以使用localhost)。
其他的问题随便输入。
最后,使用密码相同,直接回车。
操作成功的话,会在c:\resource\cas目录下产生一个mykeystore的文件
2:创建证书后,就导出证书。
>keytool -export -alias tomcat -keystore ./mykeystore -file server.crt
回车后Keystore password:changeit
操作成功的话,会在c:\resource\cas目录下产生一个server.crt的文件
3:为客户端的JVM导入密钥。
>keytool -import -alias tomcat -file ./server.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts
回车后Keystore password:changeit(注,这时输入默认的密码:changeit 不论你设置的什么密码)
特别说明:这个%JAVA_HOME%是指tomcat需要使用的JDK,当然,如果按照本文后面的用eclipse里配置的tomcat,那%JAVA_HOME%就是eclipse中tomcat所配置的JDK,如果你配到其他的jdk上,到后面实际访问服务端的时候会出现异常:unable to find valid certification path to requested target。
至此,步骤1完成。
步骤2:配置tomcat
打开%TOMCAT_HOME%/conf/server.xml,其中有这么一段代码
这段代码当前状态是被注释掉的,将他打开,并完善成如下代码:
注意事项:其中的keystoreFile="c:/resource/cas/mykeystore" ,配置上后此文件不可被删除,不然tomcat会报错:找不到此文件。
保存关闭文件,步骤2完成。
步骤3:配置CAS服务端
在c:\resource\cas\cas-server-3.3.1-release\cas-server-3.3.1\modules目录下,有个cas-server-webapp-3.3.1.war的war包,复制到%TOMCAT_HOME%/webapps目录下,并更名为cas.war。
因为我们刚才配置的是eclipse使用的JDK,所以现在通过eclipse启动tomcat
访问http://localhost:8080/cas,出现登录页面,说明部署成功。
尝试下登录,用户名和密码相同就可以登录成功。
步骤4:配置CAS客户端
在eclipse中新建一个web工程,名字:cas_client1
将c:\resource\cas\cas-client-2.0.11\cas-client-2.0.11\java\lib\casclient.jar复制到工程cas_client1的lib下面(用于单点登录)
将c:\resource\cas\cas-client-3.1.3-release\cas-client-3.1.3\modules目录下的cas-client-core-3.1.3.jar复制到工程cas_client1的lib下面(用于单点退出)
将c:\resource\cas\cas-client-3.1.3-release\cas-client-3.1.3\modules目录下的commons-logging-1.1.jar复制到工程cas_client1的lib下面(用于单点退出)
在工程cas_client1的web.xml中增加如下代码:
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
CAS Single Sign Out Filter
org.jasig.cas.client.session.SingleSignOutFilter
CAS Filter
edu.yale.its.tp.cas.client.filter.CASFilter
edu.yale.its.tp.cas.client.filter.loginUrl
https://localhost:8443/cas_server/login
edu.yale.its.tp.cas.client.filter.validateUrl
https://localhost:8443/cas_server/serviceValidate
edu.yale.its.tp.cas.client.filter.serverName
localhost:8080
CAS Single Sign Out Filter
/*
CAS Filter
/*
注意事项:web.xml中的filter要注意先后顺序,CAS Single Sign Out Filter相关配置要放在原先配置的CAS Filter的前面(至少filter-mapping要在前面)
至此,步骤4完成。
测试:同时将cas_client1和cas_server发布一下,访问http://localhost:8080/cas_client1,将自动跳转到服务端的登录页面,填写相同的用户名和密码,则成功登录并跳转回客户端的。
步骤5:单点登录和退出
按照步骤4 的流程,再创建web工程,名字:cas_client2
同时部署server,client1,client2
测试1:访问client1,登录后可以直接访问client2
测试2:访问client2,登录后可以直接访问client1
测试3:登录client1,退出后可以不可访问client1和client2
如何退出?访问https://localhost:8443/cas_server/logout就退出了。
至此,基本完成单点登录和退出功能。
连接数据库:以mysql为例,需要包cas-server-support-jdbc-3.4.7.jar(来自于cas-server-3.3.1.zip),mysql-connector-java-5.1.5-bin.jar
打开到D:\apache-tomcat-6.0.20\webapps\cas\WEB-INF,修改deployerConfigContext.xml里的文件:
找到
把它注释掉,换成
其中粉红色部分不可修改。
在文件的末尾,的上面添加如下内容:
如果用户名需要加密的话,则需修改cas-server-support-jdbc-3.4.7.jar包下的SearchModeSearchDatabaseAuthenticationHandler,把String transformedUsername = getPrincipalNameTransformer().transform(credentials.getUsername()); 改成 String transformedUsername = getPasswordEncoder().encode(getPrincipalNameTransformer().transform(credentials.getUsername())); 就可以了。
1.中文帐户不能正常登录
1、为了解决这个问题,需要给CAS的配置文件加一个过滤器EncodingFilter(就像传统JSP网站解决中文问题的方法一样)
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
这个filter要在所有filter的最前面配置。lib中加spring-framework-2.5.6.jar包。
2、中文用户名登录后,页面中出现乱码
通过String name=(String)session.getAttribute("edu.yale.its.tp.cas.client.filter.user");获取用户名。英文用户名的获取没有问题,中文用户名的获取会乱码。
解决方法:
casServiceValidationSuccess.jsp 与主页的<%@page pageEncoding="pagecharset"%> 要一样。
其它方法:
cas2.0协议的验证结果页面是通过目录:cas/WEB-INF/view/jsp/protocol/2.0/ 下定义的jsp(jstlview)
页面来定义的。
casProxySuccessView.jsp:对应验证成功的页面(这个页面还包含用户登录的帐户名)。
casServiceValidationFailure.jsp:对应验证失败页面。
乱码解决办法:
在casProxySuccessView.jsp和casServiceValidationFailure.jsp页面代码的最前面加上:<%@page pageEncoding="pagecharset"%>
其中pagecharset为页面编码,可以换为你想要的编码(GBK或是gb2312或是utf-8)。
如果还不行,试试下面两步:
1)修改CAS登陆验证页面的编码,如果你没换过这个主题的话,默认的是修改WEB-INF\view\jsp\default\ui\casLoginView.jsp文件,在最上面加上<%@ page pageEncoding="gb2312"%>。这里要特别注意一下,这个页面的编码要和上面XML文件里写的编码一致。
2)修改验证成功后做跳转的页面。也就是WEB-INF\ view\ jsp\ protocol\ 2.0\ casServiceValidationSuccess.jsp文件,在最上面加上<%@ page pageEncoding="UTF-8"%>。这里特别注意的是这个页面的编码要和你跳转过去的那个页面的编码一致,换句话说,客户端的验证页面的编码要和这个地方的一致,不一致的话,要转换一下。