CAS实现http验证的单点登陆

 1. 环境

 Windows XPJDK1.6.0_11Tomcat6.0.10

2. 下载资源

 服务端:cas-server-3.3.3-release.zip 

         下载地址:http://downloads.jasig.org/cas/ 

 客户端:cas-client-2.0.11.zip 

         下载地址:http://downloads.jasig.org/cas-clients/ 

3. 发布CAS SERVER

  将下载的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验证。

Code:
  1. if (!u.getProtocol().equals("https"))  
  2.                 throw new IOException("only 'https' URLs are valid for this method");  

再命令行进入cas-client-2.0.11/java目录,运行命令:ant dist

如果没有安装ant,则需先安装ant并配好环境变量,也可以用其他方式进行编译打包。

5. 配置服务端 CAS SERVER

5.1 配置Tomcat 6.0/webapps/cas/WEB-INF/deployerConfigContext.xml 

找到

<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"/>

5.2 配置Tomcat 6.0/webapps/cas/WEB-INF/spring-configuration/ ticketGrantingTicketCookieGenerator.xml

找到

<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窗口,都不需要验证。

5.3 配置Tomcat 6.0/webapps/cas/WEB-INF/spring-configuration/ warnCookieGenerator.xml

找到

<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",理由同上。

6. 配置客户端 CAS CLIENT

6.1 新建两个web工程,例如App1、App2

将修改客户端源代码后产生的casclient.jar文件拷贝到App1和App2的WEB-INF/lib下。casclient.jar在cas-client-2.0.11/java/lib目录下。

6.2 修改两个工程的index.jsp文件

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>

   <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>

   <href="http://localhost:8080/App1">App1</a>

  </body>

</html>

6.3 配置两个工程的web.xml

两个工程的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地址即可。

 

6.4 发布客户端应用

重启Tomcat服务器,发布App1和App2到Tomcat服务器,启动IE浏览器,在地址栏输入http://localhost:8080/App1,如果进入了cas server的登陆页面,说明URL拦截成功,输入相同的用户名和密码后进入App1的页面。

 

点击链接App2,如果不需要登陆就进入了App2的界面,则说明实现了单点登陆。

 

 

7. 数据库验证配置

简单配置后,可以使用相同的用户名和密码进行登录。这个不实际,可以通过配置实现连接自己的数据库进行配置。这里有个前提,就是所有系统需要使用相同的用户表和密码加密方法,可以使用CAS自带的加密方法(/org/jasig/cas/authentication/handler/ DefaultPasswordEncoder.class)或自己用JAVA写的加密方法。

7.1 配置deployerConfigContext.xml

进入目录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>

7.2 导入相关jar包

     由于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

7.3 建立用户表

在命令行运行命令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进行测试了。

 

 

8 附录

8.1 App1的build.xml 

Code:
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project name="App1" default="war" basedir=".">  
  3.     <property name="app.name" value="App1" />  
  4.     <property name="src.dir" value="src" />  
  5.     <property name="web.dir" value="WebRoot" />  
  6.     <property name="build.dir" value="${web.dir}/WEB-INF" />  
  7.     <property name="build.classes.dir" value="${build.dir}/classes" />  
  8.     <property name="tomcat.home" value="D:/JavaEEServer/Tomcat 6.0" />  
  9.     <property name="tomcat.deploy.dir" value="${tomcat.home}/webapps" />  
  10.   
  11.     <path id="classpath">  
  12.         <fileset dir="${build.dir}/lib">  
  13.             <include name="*.jar" />  
  14.         </fileset>  
  15.         <fileset dir="${tomcat.home}/lib">  
  16.             <include name="*.jar" />  
  17.         </fileset>  
  18.         <pathelement location="${build.classes.dir}" />  
  19.     </path>  
  20.   
  21.     <target name="prepare">  
  22.         <mkdir dir="${build.classes.dir}" />  
  23.     </target>  
  24.   
  25.     <target name="javac" depends="prepare">  
  26.         <javac srcdir="${src.dir}" destdir="${build.classes.dir}" deprecation="false" debug="on" classpathref="classpath">  
  27.         </javac>  
  28.     </target>  
  29.   
  30.     <target name="war" depends="javac">  
  31.         <war warfile="${app.name}.war" webxml="${build.dir}/web.xml" basedir="${web.dir}">  
  32.             <exclude name="*/web.xml"/>  
  33.         </war>  
  34.     </target>  
  35.       
  36.     <target name="deploy" depends="war">  
  37.         <copy file="${app.name}.war" todir="${tomcat.deploy.dir}"></copy>  
  38.     </target>  
  39. </project>  

你可能感兴趣的:(tomcat,bean,加密,数据库,服务器,encoding)