在Tomcat上配置CAS 自己的体验
演示环境
本文演示过程在同一个机器上的(也可以在三台实体机器或者三个的虚拟机上),环境如下:
- windows732位
- JDK 1.6.0_18
- Tomcat 6.0.29
- CAS-server-3.4.11、CAS-client-3.2.1
根据演示需求,用修改hosts 文件的方法添加域名,在文件 C:\Windows\System32\drivers\etc\hosts 文件中添加三条
127.0.0.1 localhost1
127.0.0.1 localhost2
127.0.0.1 sunhan(这个在生成证书的时候用的上,由于一开始不知道就随便写了,后来才知道这个地方后面要用的到)
sunhan =>>对应部署cas server的tomcat,这个虚拟域名还用于证书生成
localhost1 =>> 对应部署app1的tomcat
localhost2 =>>对应部署app2的tomcat
生成证书
在C盘根目录下建立子文件夹“Keys”,用于存放证书。
单击“开始 -> 运行",输入“cmd”,单击“确定”启动命令提示符窗口。
输入“cd "c:\Program Files\Java\jre7\bin"”进入jre7的bin目录下。
执行命令“keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keystore F:\SSO\keys\.keystore -validity 3600”创建证书。如图:
注:1.要提前建好目录:F:\SSO\keys
2.changeit 就是你要的密码,在后续的配置文件中会用到这个。
3.sunhan 此处就是当作服务器端域名
将证书导入的JDK的证书信任库中
第一步:导出证书。
执行命令“keytool -export -trustcacerts -alias tomcat -file F:\SSO\keys\tomcat.cer -keystore F:\SSO\keys\.keystore -storepass changeit”将证书导出到Keys文件夹。
第二步:将证书导入到JDK证书信任库。
执行命令“keytool -import -trustcacerts -alias tomcat -file F:\SSO\keys\tomcat.cer -keystore "C:\Program Files\Java\jre7\lib\security\cacerts" -storepass changeit”。系统询问是否信任此证书,回答“y”。
注:想我,可能测试两边的,他会提示证书已经存在,请用下面第二个方法进行证书删除
其他有用keytool命令(列出信任证书库中所有已有证书,删除库中某个证书):
keytool -list -v -keystore "C:\Program Files\Java\jre7\lib\security\cacerts"
keytool -delete -trustcacerts -alias tomcat -keystore "C:\Program Files\Java\jre7\lib\security\cacerts" -storepass changeit
配置server.xml文件
以管理员身份运行文字编辑器,打开%TOMCAT_HOME%\conf\server.xml。查找SSL配置并将如下内容插入其中。
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="F:/SSO/keys/.keystore" keystorePass="changeit" />
然后启动该路径下的tomcat ,分别测试“http://demo:8080”和“https://demo:8443/”
安装 CAS
解压缩下载下来的“cas-server-3.5.1-release.zip”,
在“modules”文件夹中找到“cas-server-webapp-3.5.1.war”,将其重命名为“cas.war”
将“cas.war”拷贝到“%TOMCAT_HOME%\webapps”(这里要注意一下,我是没有设置这个环境变量的,为了测试SSO,用的新建的tomcat的)文件夹下。稍等一会儿刷新一下,就会看到Tomcat自动将“cas.war”解压到“cas”文件夹中。如下图:
测试 CAS
在默认配置下,CAS认为只要用户名密码相同即登录成功。我们可以通过修改配置以实现基于数据库的身份验证。不过目前我们先以默认配置进行测试。
在浏览器中输入网址“https://demo:8443/cas/login”,如果IE有证书警告信息,直接点击“继续浏览此网站(不推荐)。
如果用户名与密码相同,则系统显示登录成功:
部署CAS-Client相关的Tomcat
Cas-Client下载
CAS-Client下载地址:http://downloads.jasig.org/cas-clients/
以cas-client-3.2.1-release.zip为例,解压提取cas-client-3.2.1/modules/cas-client-core-3.2.1.jar
借以tomcat默认自带的webapps\examples 作为演示的简单web项目
安装配置tomcat-app1
解压apache-tomcat-6.0.29.tar.gz并重命名后的路径为F:\SSO\tomcat1,修改tomcat的启动端口(共计5处),在文件conf/server.xml文件找到如下内容:
<Serverport="8005" shutdown="SHUTDOWN"> <Connectorport="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />
修改成如下:
<Serverport="18005" shutdown="SHUTDOWN"> <Connectorport="18080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18443" /> <Connectorport="18009" protocol="AJP/1.3"redirectPort="18443" />
启动tomcat1,浏览器输入http://localhost1:18080/examples/servlets/回车:
接下来复制client的lib包cas-client-core-3.2.1.jar和commons-logging-1.1.jar到 tomcat1\webapps\examples\WEB-INF\lib\目录下,在tomcat1\webapps\examples\WEB-INF\web.xml 文件中增加如下内容:
<!-- ======================== 单点登录开始 ======================== --> <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 --> <listener> <listener-class>org.jasig.cas.cl"F:/SSO/tomcat1/webapps/examples/WEB-INF/web.xml"ient.session.SingleSignOutHttpSessionListener</listener-class> </listener> <!-- 该过滤器用于实现单点登出功能,可选配置。 --> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 该过滤器负责用户的认证工作,必须启用它 --> <filter> <filter-name>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>https://localhost:8443/cas/login</param-value> <!--这里的server是服务端的IP --> </init-param> <init-param> <param-name>serverName</param-name> <param-value>https://localhost:8443</param-value> </init-param> </filter> <filter-mapping> <filter-name>CASFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 该过滤器负责对Ticket的校验工作,必须启用它 --> <filter> <filter-name>CAS Validation Filter</filter-name> <filter-class> org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://localhost:8443/cas</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>https://localhost:8443</param-value> </init-param> </filter> <filter-mapping> <filter-name>CAS Validation Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 --> <filter> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <filter-class> org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 --> <filter> <filter-name>CAS Assertion Thread Local Filter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Assertion Thread Local Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- ======================== 单点登录结束 ======================== -->
有关cas-client的web.xml修改的详细说明见官网介绍:
https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml
同样的方式部署一个tomcat2
七、 测试验证SSO
启动之前配置好的三个tomcat分别为:tomcat-cas、tomcat-app1、tomcat-app2.
7.1 基本的测试
预期流程:打开app1 url —->跳转cas server验证 —->显示app1的应用 —->打开app2 url —->显示app2应用 —->注销cas server —->打开app1/app2url —->重新跳转到cas server验证.
打开浏览器地址栏中输入:http://localhost:18080/examples/servlets/servlet/HelloWorldExample
这里要注意一点:服务器端的jdk 和 客户端的jdk要指定不同的
本文所有知识都是通过一下博客获取。再次感谢他