1. 环境
Windows XP、JDK1.6.0_11、Tomcat6.0.10
服务端:cas-server-3.3.3-release.zip
下载地址:http://downloads.jasig.org/cas/
客户端:cas-client-2.0.11.zip
下载地址:http://downloads.jasig.org/cas-clients/
将下载的cas-server解压,进入cas-server-3.3.3/modules,复制cas-server-webapp-3.3.3.war到tomcat/webapps下,修改名称为cas.war,方便使用,原来的名字太长了。然后启动IE,输入http://localhost:8080/cas检验是否可以访问,如果可以,则输入相同的用户名和密码,比如cas/cas,测试是否能登录。
4. 修改客户端源代码
解压cas-client-2.0.11.war,进入cas-client-2.0.11/java/src,修改edu.yale.its.tp.cas.util包下的SecureURL类,在retrieve方法里面注释掉如下两行,使之支持http验证。
再命令行进入cas-client-2.0.11/java目录,运行命令:ant dist
如果没有安装ant,则需先安装ant并配好环境变量,也可以用其他方式进行编译打包。
找到
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" /> |
增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用,加上去之后如下:
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" p:requireSecure="false"/> |
找到
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure="true" p:cookieMaxAge="-1" p:cookieName="CASTGC" p:cookiePath="/cas" /> |
将参数p:cookieSecure="true"改为p:cookieSecure="false",同理为HTTPS验证相关,TRUE为采用HTTPS验证,与deployerConfigContext.xml的参数保持一致。
参数p:cookieMaxAge="-1",简单说是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。
找到
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure="true" p:cookieMaxAge="-1" p:cookieName="CASPRIVACY" p:cookiePath="/cas" /> |
同样将参数p:cookieSecure="true"改为p:cookieSecure="false",理由同上。
将修改客户端源代码后产生的casclient.jar文件拷贝到App1和App2的WEB-INF/lib下。casclient.jar在cas-client-2.0.11/java/lib目录下。
App1:
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>App1</title> </head> <body> 这是App1的界面 <br> <a href="http://localhost:8080/App2">App2</a> </body> </html> |
App2:
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>App2</title> </head> <body> 这是App2的界面 <br> <a href="http://localhost:8080/App1">App1</a> </body> </html> |
两个工程的web.xml 配置完全相同:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
<!-- 用于单点登录 --> <filter> <filter-name>CAS Filter</filter-name> <filter-class> edu.yale.its.tp.cas.client.filter.CASFilter </filter-class> <!--下面两个为验证地址,即cas server的地址, 如果使用https验证,地址为https://hostname:8443字样-->
<init-param> <param-name> edu.yale.its.tp.cas.client.filter.loginUrl </param-name> <param-value>http://localhost:8080/cas/login</param-value> </init-param> <init-param> <param-name> edu.yale.its.tp.cas.client.filter.validateUrl </param-name> <param-value> http://localhost:8080/cas/serviceValidate </param-value> </init-param> <!-- 本工程的URL,被拦截的地址 --> <init-param> <param-name> edu.yale.its.tp.cas.client.filter.serverName </param-name> <param-value>localhost:8080</param-value> </init-param> </filter>
<filter-mapping> <filter-name>CAS Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> |
注:本例子客户端和服务端发布在同一个tomcat,如果发布在不同的服务器,将url地址中的localhost改为相应的ip地址即可。
重启Tomcat服务器,发布App1和App2到Tomcat服务器,启动IE浏览器,在地址栏输入http://localhost:8080/App1,如果进入了cas server的登陆页面,说明URL拦截成功,输入相同的用户名和密码后进入App1的页面。
点击链接App2,如果不需要登陆就进入了App2的界面,则说明实现了单点登陆。
简单配置后,可以使用相同的用户名和密码进行登录。这个不实际,可以通过配置实现连接自己的数据库进行配置。这里有个前提,就是所有系统需要使用相同的用户表和密码加密方法,可以使用CAS自带的加密方法(/org/jasig/cas/authentication/handler/ DefaultPasswordEncoder.class)或自己用JAVA写的加密方法。
进入目录tomcat/webapps/cas/WEB-INF,打开文件deployerConfigContext.xml,找到下面的代码:
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> |
这是默认的验证方法。同时还有两种可选,如下:
方法1:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="casDataSource" /> <property name="sql" value="select password from tbUser where lower(username) = lower(?)" /> </bean> |
方法2:
<bean class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler" abstract="false" lazy-init="default" autowire="default" dependency-check="default"> <property name="dataSource" ref="casDataSource" /> <property name="tableUsers" value="tbUser" /> <property name="fieldUser" value="username"/> <property name="fieldPassword" value="password"/> <property name="passwordEncoder" ref="passwordEncoder"/> </bean> |
另外,也可以写出自己的方法验证,修改BEAN的CLASS属性即可。如果没有密码没有加密,则可以把参数<property name="passwordEncoder" ref="passwordEncoder"/>去掉。
将默认的验证bean注释掉,选择两种数据库验证中的一种配置在deployerConfigContext.xml
中,位置与默认的验证bean相同。两种数据库验证bean都引用了casDataSource Bean,将casDataSource配置在deployerConfigContext.xml中,注意casDataSource bean 必须配置在<beans>节点下面,而不是配置在authenticationManager bean的属性节点中,不然会报错。
<!--mysql--> <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://127.0.0.1/test"></property> <property name="username" value="root"></property> <property name="password" value="lijiecsu"></property> <property name="maxActive" value="100"></property> <property name="maxIdle" value="30"></property> <property name="maxWait" value="500"></property> <property name="defaultAutoCommit" value="true"></property> </bean> |
如果用到了密码加密,则还需配置passwordEncoder bean:
<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName"> <constructor-arg value="MD5"/> </bean> |
由于CAS-SERVER.WAR默认没有采用数据库验证,所以部分JAR包没有引入,下面这些需要复制到webapps/cas/WEB-INF/lib里面:
mysql-connector-java-5.1.8.jar
cas-server-support-jdbc-3.3.3.jar
commons-dbcp.jar
commons-pool.jar
spring.jar
在命令行运行命令net start mysql 启动数据库,运行命令 mysql -uroot -plijiecsu 进入数据库(密码输入你自己的密码),进入数据库后运行命令 use test 选择test数据库,输入sql语句创建用户表:
create table tbUser ( id int primary key auto_increment, username varchar(30), password varchar(30) ); |
插入一个测试用户:
insert into tbUser values (null, 'test', 'test'); |
OK,现在可以启动Tomcat进行测试了。