25p:
httpClient-ref="httpClient"
26p:
requireSecure="false"
27/>
完成这些地方的修改后,服务器端就支持了http协议的访问了下面开始客户端的改动,客户端其实就是将client.jar包里面关于https协议的处理代码给屏蔽掉,已经重新打jar包出来了,直接就能使用。
原理如下。
看过CAS客户端的源码的都知道,在配置过滤器类中,都做了访问协议的判断如下代码:
[html]viewplaincopyprint?
1if(casServiceUrl!
=null){
2if(!
(casServiceUrl.startsWith("https:
//")||(casServiceUrl.startsWith("http:
//")))){
3thrownewServletException("serviceURLmuststartwithhttp:
//orhttps:
//;itscurrentvalueis["+casServiceUrl+"]");
4}
5}
所以首先我们要做的是需要将casclient.jar的源码找到,将上面类似的这种协议判断屏蔽掉。
具体在一下2个类里面:
第一个是:
CASFilter这个类里面中的init()方法中,https的判断屏蔽后如下:
[html]viewplaincopyprint?
6if(casGateway&&Boolean.valueOf(casRenew).booleanValue()){
7thrownewServletException("gatewayandrenewcannotbothbetrueinfilterconfiguration");
8}
9if(casServerName!
=null&&casServiceUrl!
=null){
10thrownewServletException("serverNameandserviceUrlcannotbothbeset:
chooseone.");
11}
12if(casServerName==null&&casServiceUrl==null){
13thrownewServletException("oneofserverNameorserviceUrlmustbeset.");
14}
15/*if(casServiceUrl!
=null){
16if(!
(casServiceUrl.startsWith("https:
//")||(casServiceUrl.startsWith("http:
//")))){
17thrownewServletException("serviceURLmuststartwithhttp:
//orhttps:
//;itscurrentvalueis["+casServiceUrl+"]");
18}
19}*/
20
21if(casValidate==null){
22thrownewServletException("validateUrlparametermustbeset.");
23}
24/*if(!
casValidate.startsWith("https:
//")){
25thrownewServletException("validateUrlmuststartwithhttps:
//,itscurrentvalueis["+casValidate+"]");
26}
27*/
28if(casAuthorizedProxy!
=null){
29
30//parseandrememberauthorizedproxies
31StringTokenizercasProxies=
32newStringTokenizer(casAuthorizedProxy);
33while(casProxies.hasMoreTokens()){
34StringanAuthorizedProxy=casProxies.nextToken();
35/*if(!
anAuthorizedProxy.startsWith("https:
//")){
36thrownewServletException("CASFilterinitializationparameterforauthorizedproxies"+
37"mustbeawhitespacedelimitedlistofauthorizedproxies."+
38"Authorizedproxiesmustbesecure(https)addresses.Thisonewasn't:
["+anAuthorizedProxy+"]");
39}*/
40this.authorizedProxies.add(anAuthorizedProxy);
41}
42}
第二个是:
edu.yale.its.tp.cas.util.SecureURL这个类里面的retrieve方法中,屏蔽后如下:
[html]viewplaincopyprint?
43URLu=newURL(url);
44/*if(!
u.getProtocol().equals("https")){
45//IOExceptionmaynotbethebestexceptionwecouldthrowhere
46//sincetheproblemiswiththeURLargumentwewerepassed,not
47//IO.-awp9
48log.error("retrieve("+url+")onanillegalURLsinceprotocolwasnothttps.");
49thrownewIOException("only'https'URLsarevalidforthismethod");
50}*/
51
52URLConnectionuc=u.openConnection();
重新打包后将casclient.jar更新到我们的程序第三方lib包中。
做完这些,就能达到能让服务器利用http协议进行登录cas服务端的效果。
3.1.2Https配置教程
3.1.2.1设置服务器域名
⏹修改hosts文件
在SERVER端C:
\\Windows下搜索hosts文件,并在最后边一行加上如下内容:
127.0.0.1castest#Server
同样在CLIENT端也应有相对应的设置:
SERVERIPcastest#client(这里的SERVERIP是指服务端的IP)
3.1.2.2生成证书(这里采用JDK自带的工具keytool)
⏹简述:
CAS单点登录系统中服务端与客户端进行安全通信的保障就是证书钥匙,这里的证书是采用JDK所自带的keytool生成的证书,如果是在正式环境中部署应去供应商处购买。
⏹官网:
3.1.2.3生成服务器端证书文件
Keytool–genkey–aliasserver–keyalgRSA–keystoreserverkey
注:
这里的名字与姓氏最好填写域名,严禁使用IP,此处密码采用的是changeit与JDK默认密码一致,可随意设置(不要忘记)。
3.1.2.4导出服务端证书
Keytool–export–fileserver.crt–aliasserver–keystoreserverkey
注:
此处密码与上方设置密码相同
3.1.2.5为客户端JVM导入证书
将生成的server.crt文件分发给各个客户端后,使用CMD命令为JVM导入证书。
Keytool–import–keystore%java_home%\jre\lib\cacerts–fileserver.crt–aliasserver
视个人情况而定,网上好多帖子都说是jre下的cacerts而不是jdk/jre/cacerts,这主要是看tomcat用哪个jre,视个人情况而论。
此所用到的是jdk中的jre
也可以自己指定目录,创建完cacerts后再将其复至到jre/lib/security/也可以。
但这样会覆盖JDK原有的证书(不建议使用)
至此基本环境已经配好。
注:
此部署是在客户机上导入,不需要在服务器中导入。
3.1.2.6将证书应用到Web服务器Tomcat
启用Tomcat的https加密协议,至于为什么加密自己去GOOGLE一下。
将Tomcat下的conf/server.xml里如下代码的注释去掉,并加入证书的路径和密码。
OK,这样SSL就启用成功了,可以进入https:
//castest:
8443/查看一下是否启用成功
注:
此步客户端与服务端都需要配置,直接将服务器端生成的文件发给客户端使用即可,此处所用到的serverkey是在服务端生成的证书文件,密码为自定义设置的密码
3.1.3部署CAS服务器
⏹CAS服务端下载:
http:
//www.jasig.org/cas/download
⏹下载的包解压后,将cas-server-3.4.5\modules\cas-server-webapp-3.4.5.war复制到webapps目录下,重命名为cas.war
⏹启动TOMCAT访问地址:
https:
//castest:
8443/cas/login
⏹输入admin/admin(用户名和密码相同即可)后即可登录,登录成功后的页面为:
如果没有成功,请仔细检查上边的步骤
3.1.4深入配制CAS服务器
上边的登录只是CAS默认的登录,在我们的系统应用中都是从数据库中获取的信息,所以这里需要更改一下配置。
⏹将deployerConfigContext.xml中的如下行注释掉:
⏹
⏹加入代码,见附件1
⏹将所用连接的数据库驱动和cas-server-support-jdbc-3.4.3.1.jar放入工程中的lib下
⏹cas.properties中使用哪种数据库就将相应驱动前边的#去掉
3.1.5配制CAS客户端
⏹http配置使用cas-client-http.jar
⏹https配置使用cas-client-https.jar,地址:
http:
//www.ja-sig.org/downloads/cas-clients/,然后解压cas-client-3.2.0.zip,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用
⏹设置web.xml的filter如下
xmlversion="1.0"encoding="UTF-8"?
>
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"version="2.5"
xsi:
schemaLocation="
--解决中文乱码问题-->
springfilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
springfilter
/*
--解决中文乱码问题-->
--用于单点退出-->
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
CASSingleSignOutFilter
org.jasig.cas.client.session.SingleSignOutFilter
--用于单点登录-->
CASFilter
edu.yale.its.tp.cas.client.filter.CASFilter
edu.yale.its.tp.cas.client.filter.loginUrl
--loginUrl:
服务端tomcat所启动的ip和port-->
http:
//192.168.168.141:
8080/casServer/login
edu.yale.its.tp.cas.client.filter.validateUrl
--validateUrl:
服务端tomcat所启动的ip和port-->
http:
//192.168.168.141:
8080/casServer/serviceValidate