CAS入门学习— 安装与配置

1 概述
  1.1 背景
      单点登录是必须的,实现方式颇多,这里就说使用CAS的实现方式。
      使用CAS实现SSO,网络上说明很多,大部分都是从制作证书开始,而实际上是可以不使用HTTPS验证,这样更方便。
      单点登录的原理是通过拦截你设定的URL,并跳转到你指定的CAS SERVER登录页,
      当你登录成功后,带着TICKET,返回到你打开的URL。然后你就可以一票在手,畅通无阻。
      网上有个家伙用旅游的套票来解释单点登录,非常形象。
      当你到达一个旅游区门口,你可以买一个套票,套票规定你可以游览N个景点,进入这些景点的时候,你不需要再买票,也就实现了单点登录。
      同时,也可以借用这个比喻说明一下单点注销。
      当你打开一个应用A时,单击了注销按钮,跳转到http://hostname:port/cas/logout 或者https://hostname:port/cas/logout ,
      系统显示注销成功。此时,IE窗口没有关闭,你继续打开应用A,仍然没有注销成功,不需要登录。
      这就相当于你已经在旅游景点内,即使你把套票撕毁了,你仍然可以继续参观这个景点,不会把你驱逐出去。
      但是,你再也进不了其它的景点了。
      那么怎么实现立即生效的注销呢?或者这种方式是否就满足我们的需求呢?
  1.2 环境
      Windows XP、JDK1.6.03、Tomcat6.0.20
    注意:配置好环境变量。
  1.3 下载资源
    服务器端:http://www.ja-sig.org/downloads/cas
      cas-server-3.3.3-release.zip
    客户端:https://www.ja-sig.org/svn/cas-clients/
        cas-client-2.0.11.zip             JAVA支持单点登录
        cas-client-3.1.8-release.zip        JAVA支持单点注销
        dotnet-client                              DOTNET支持类
        phpcas                                      PHP支持   
    注意:同时要下载源代码,部分功能需要修改源代码,重新做包。

2 配置CAS SERVER
  2.1 默认配置
      把你下载cas-server-3.3.3-release.zip解压,
      进入cas-server-3.3/modules,
      复制cas-server-webapp-3.3.war到tomcat/webapps下,
      修改名称为cas.war,方便使用,原来的名字太长了。
      然后启动IE,输入http://localhost:8080/cas检验是否可以访问,
      如果可以,则输入相同的用户名和密码,比如cas/cas,测试是否能登录。
      如果你对安全性要求不高且急不可待,这个时候就可以直接进行CAS CLIENT的配置。
  2.2 数据库验证配置
    2.2.1 数据库验证配置-简单示例
      这里要连接数据库,通过将用户输入的用户名和密码,和数据库中的数据对照,
      如果数据库中存在,那么通过,如果没有,那么认证失败,用户不能登录。
      具体做法如下:
      首先安装好mysql。
      然后在数据库中添加一个用户casserver,密码是casserver。然后添加database cas,添加个一个tables app_user,并赋值给他。
      mysql> create databases cas;
      mysql> use cas;
      mysql> create table app_user (username varchar(30) not null default'',
      password varchar(45) not null default'', primary key (username));
      mysql> insert into app_user (username,password) values ('test01','psw01'),('test02','psw02');    
      找到刚才解压到tomcat/webapps的那个cas包,修改在cas/WEB-INF/目录下的deployerConfigContext.xml 文件:     
      找到这段话<beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:p="http://www.springframework.org/schema/p"
            xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
      由于我使用的是mysql数据库,因此在后面添加
      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
             <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
             <property name="url"><value>jdbc:mysql://127.0.0.1:3306/cas</value></property>
             <property name="username"><value>casserver</value></property>
             <property name="password"><value>casserver</value></property>
      </bean>  
      再找到如下内容:
      <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
      将它注释掉,在其下面放入我们的认证方式:
      <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
            <property name="sql" value="select password from app_user where username=?" />
            <property name="dataSource" ref="dataSource" />
      </bean>
      接下来,要实现功能,还得要添加一些必要的模块驱动到cas/WEB-INF/bin目录下,总共6个文件,我是全部放进去了:
      spring-jdbc.jar                      commons-dbcp-1.2.2.jar                           
      commons-collections-3.2.1.jar        mysql-connector-java-3.1.11-bin.jar
      cas-server-support-jdbc-3.3.1.jar    commons-pool-1.3.jar
      将他们全都拷贝到tomcat/webapps/cas/WEB-INF/lib。
      到这里就OK了,这时再重启tomcat,打开http://localhost:8080/cas
      会发现如果输入的用户名和密码和数据库中的不一致,认证就不能通过。这表明数据库认证已经起作用了。 
    2.2.2 数据库验证配置-详细说明
      简单配置后,可以使用相同的用户名和密码,进行登录。这个不实际,可以通过配置实现连接自己的数据库进行配置。
         这里有个前提,就是所有系统需要使用相同的用户表和密码加密方法,
         可以使用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" />
      (注意:cas-server根据版本不同,文件的路径或BEAN位置可能不同,逐个文件夹找下。)
      这是默认的方法。

 

 

在 cas-server-support-jdbc-3.3.jar 包中,提供了 3 个基于 JDBC 的 AuthenticationHandler,分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其中 BindModeSearchDatabaseAuthenticationHandler 是用所给的用户名和密码去建立数据库连接,根据连接建立是否成功来判断验证成功与否;QueryDatabaseAuthenticationHandler 通过配置一个 SQL 语句查出密码,与所给密码匹配;SearchModeSearchDatabaseAuthenticationHandler 通过配置存放用户验证信息的表、用户名字段和密码字段,构造查询语句来验证。使用哪个 AuthenticationHandler,需要在 deployerConfigContext.xml 中设置 

 

同时还有两种可选,如下:
      <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
                   <property name="dataSource" ref="casDataSource" />
                   <property name="sql" value="select password from tbUser where lower(name) = lower(?)" />

                   <property name="passwordEncoder" ref="passwordEncoder"/>

      </bean>
      和
      <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="u_userid"/>
                   <property name="fieldPassword" value="u_password"/>
                   <property name="passwordEncoder" ref="passwordEncoder"/>
      </bean>
      以上两种方式都经过测试。另外,也可以写出自己的方法验证,修改BEAN的CLASS属性即可。
      如果没有密码没有加密,则可以把参数<property name="passwordEncoder" ref="passwordEncoder"/>去掉。
      下面针对最第二种方法进行说明:
         看它的属性,还需要定义两个BEAN,数据源和加密,如下:
         <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <!—SQL SERVER-->
          <!—
         <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
         <property name="url" value="jdbc:sqlserver://10.7.3.90:1433;DatabaseName=itacc"></property>
         <property name="username" value="zero" />
         <property name="password" value="123456" />           
        --> 
        <!--ORACLE-->   
         <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
              <property name="url" value="jdbc:oracle:thin:@10.7.3.90:1521:orcl"></property>
              <property name="username" value="zero"></property>
              <property name="password" value="123456"></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>    
      <!—加密-->
      <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里面:
        Cas-server-support-jdbc-3.3.3.jar
        Cas-server-support-ldap-3.3.3.jar
        Commons-dbcp.jar
        Commons-pool.jar
        Org.springframework.jdbc-3.0.0.M4.jar        //spring要根据自己的版本选择
        Org.springframework.transaction-3.0.0.M4.jar
        Sqljdbc.jar                                                     //数据库连接JAR,根据自己的复制
        Oraclejdbc.jar  
      完成以后,用户表数据准备好后,可以运行http://localhost:8080/cas进行登录测试。
      这个时候很容易出现错误,多数是因为JAR包问题,注意查看tomcat/logs日志文件,进行检查,问题很容易解决。
  2.3 参数配置
    这里只说明一下我涉及到的参数,可能有更多参数,目前还没有用到。
    2.3.1
      tomcat/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"/>   
    2.3.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",同理为HTTPS验证相关,TRUE为采用HTTPS验证,与deployerConfigContext.xml的参数保持一致。
      参数p:cookieMaxAge="-1",简单说是COOKIE的最大生命周期,-1为无生命周期,
      即只在当前打开的IE窗口有效,IE关闭或重新打开其它窗口,仍会要求验证。
      可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意IE窗口,都不需要验证。  
      warnCookieGenerator.xml
      <bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
              p:cookieSecure="true"
              p:cookieMaxAge="-1"
              p:cookieName="CASPRIVACY"
              p:cookiePath="/cas" />
      两个参数与上面同理。  
    2.3.3 TICKET的生命周期也可以在web.xml加这个参数实现:
      <!-- Timeout for granting tickets -->
      <context-param>
            <param-name>edu.yale.its.tp.cas.grantingTimeout</param-name>
            <param-value>7200</param-value>
      </context-param>  
  2.4 HTTPS验证配置
    证书的制作使用keytool工具,进入CMD,输入keytool,
    回车测试,如果出现帮助,则说明环境变量配置正确,如果没有,则配置PATH,加入%JAVA_HOME%/BIN。  
    下面开始制作,先切换到E:/key目录,下面找好存放证书的位置:
    2.4.1
      keytool -genkey -alias tomcatcas -keystore tomcatcas -keyalg RSA -validity 3666
      这一步是制作密钥库。  
      注意:名字与姓氏要输入主机名或域名或localhost,不能随意输入。密码为自己设定。下面的密码直接回车。
    2.4.2
      keytool -export -alias tomcatcas -keystore tomcatcas -file tomcatcas.crt
        这一步是把密钥库导出为证书文件。  
      注意:密码为上一步设定的密码。 
    2.4.3
      keytool -import -alias tomcatcas -file tomcatcas.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts
        这一步是把证书导入TOMCAT。
      后面的路径为TOMCAT使用的JRE路径,JDK1.6安装有两个目录JDK1.6和JRE1.6,TOMCAT6.0只要JRE1.6即可,通常在安装时,也都是默认到JRE1.6,这时要输入%JRE_HOME%/lib/security/cacerts,这个地方必须要确认准确。
        注意:这里需要输入密码,此密码不是前面设定的密码,是系统默认的密码changeit   
    2.4.4 配置tomcat6.0/conf/server.xml
      <!--
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                     maxThreads="150" scheme="https" secure="true"
                     clientAuth="false" sslProtocol="TLS"
                     />
      -->
      加入密钥库文件和密码(前面设定的密码),修改为
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                     maxThreads="150" scheme="https" secure="true"
                     clientAuth="false" sslProtocol="TLS"
                     keystoreFile="E:/key/tomcatcas"
                     keystorePass="123456"
                     />
      注意:密钥库文件的要放到安全的位置,不能被随意移动。 
    完成后,可重启TOMCAT,进行测试。 
  2.5 自定义页面   
      CAS页面文件放在Tomcat 6.0/webapps/cas/WEB-INF/view/jsp中,页面配置文件在Tomcat 6.0/webapps/cas/WEB-INF/classes中,
      比如default_views.properties,在这里指定登录用哪个页面,注销用哪个页面等等。
    在Tomcat 6.0/webapps/cas/WEB-INF/cas.properties文件指定使用哪个皮肤页面。
      下面开始操作:
      2.5.1
        进入Tomcat 6.0/webapps/cas/WEB-INF/view/jsp,复制default文件夹,并改名,再复制回来,如myth。
      2.5.2
        进入Tomcat 6.0/webapps/cas/WEB-INF/classes,复制default_views.properties,并改名再复制回来,如myth_views.properties。
      打开文件,把里面的目录../jsp/default/ui修改为自己的路径,如../jsp/myth/ui。
      2.5.3
        进入Tomcat 6.0/webapps/cas/WEB-INF,打开cas.properties文件,
        修改 cas.viewResolver.basename=myth_views
      完成以上3步后,打开IE,进入http://localhost:8080/cas进行测试,如果能成功登录则进行下一步。
      注意:文件中logout使用的类。
    2.5.4
      最后一点说明,Tomcat 6.0/webapps/cas/WEB-INF/cas-server.xml中,有个BEAN:
          <bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
              p:order="0">
              <property name="basenames">
                  <list>
                      <value>${cas.viewResolver.basename}</value>
                      <value>protocol_views</value>
                  </list>
              </property>
          </bean>
      这个不要修改,否则出现http code 500 for url 。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页