CAS服务端搭建及定制

一、   准备工作

1、下载cas-server-3.5.1.war和cas-client-3.1以及tomcat6

2、学习下spring web flow,cas3.5使用了spring webflow做流程转向控制。

 

二、   搭建CAS服务端

1、 生成服务端数字证书

keytool -genkey -v-alias casserver -keyalg RSA -keystore D:/casserver.keystore -dname "CN=cas.server,OU=所属组织,O=所属单位,L=城市,ST=省,C=所在国家" -validity 3650 -storepass password  -keypasspassword

CN不建议使用IP,建议使用计算机名称或域名

2、  生成客户端数字证书(仅建立双向SSL认证时配置)

下一步是为浏览器生成证书,以便让服务器来验证它。假设文件存放在D:/client.p12,为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,因此,使用如下命令生成:

keytool -genkey -v-alias client -keyalgRSA -storetype PKCS12 –keystoreD:/client.p12 -dname"CN=client,OU=所属组织,O=所属单位,L=城市,ST=省,C=所在国家" -validity 3650 -storepass密码 -keypass密码

-validity为有效期限,目前的设置为10年,keypass用于在导入浏览器时使用的密码,如果密码不正确,则不能正确导入到浏览器。
对应的证书库存放在“D:/client.p12”,客户端的CN可以是任意值。

3、  让服务端相信客户端数字证书(仅建立双向SSL认证时配置)

由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,我们必须先把客户端证书导出为一个单独的CER文件,使用如下命令:

keytool -export-alias client -keystore  D:/client.p12 -storetype PKCS12 -storepass密码 -rfc -file D:/client.cer

通过以上命令,客户端证书就被我们导出到“D:/client.cer”文件了。下一步,是将该文件导入到服务器的证书库,添加为一个信任证书:

keytool -import-alias client -v -file D:/client.cer -keystore D:/client.keystore -storepass密码

通过list命令查看服务器的证书库,我们可以看到两个输入,一个是服务器证书,一个是受信任的客户端证书

4、 配置Tomcat服务器

打开Tomcat根目录下的/conf/server.xml,找到如下配置段,修改如下:

    maxThreads="150" scheme="https"secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile=" D:/casserver.keystore "keystorePass="密码 "
    truststoreFile=" D:/casserver.keystore "truststorePass="密码 "
/>

其中,clientAuth指定是否需要验证客户端证书,如果该设置为“false”,则为单向SSL验证,SSL配置可到此结束。如果clientAuth设置为“true”,表示强制双向SSL验证,必须验证客户端证书。如果clientAuth设置为“want”,则表示可以验证客户端证书,但如果客户端没有有效证书,也不强制验证。

         5、导入客户端证书(仅建立双向配置时需要)

如果设置了clientAuth="true",则需要强制验证客户端证书。双击“D:/client.p12”即可将证书导入至IE:导入证书后,即可启动Tomcat,用IE进行访问。输入[url]https://IPAdress/[/url]      ,https协议默认的访问端口为8443。

6、 部署cas服务端

将下载的cas-server-3.5.1.war重命名为cas.war,并放到tomcat中的webapps文件夹下。启动Tomcat,在浏览器中输入https://localhost:8443/cas就可以进入cas的登陆页面了。

7、 更改CAS服务端的用户信息验证方式

在服务端tomcat中,找到tomcat/webapps/cas/web-inf中的deployerConfigContext.xml,找到

这是CAS默认身份认证,只要用户名和密码相同就可以登录,注释掉。定制自己的认证,替换成

      

cn.com.wz.encodePasswordHandler是自己编写的继承了AbstractJdbcUsernamePasswordAuthenticationHandler的用户信息验证类。

       在这个文件中再添加一个数据源的bean,如下:

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:@192.168.107.8:1521:orcl

                            ewp

                            ewp

      

同时要把链接自己数据库的ORACLE JAR包资源等,放入项目的LIB目录下。

 

 

8、 修改CAS服务端的默认页面

最简单的方式直接修改\webapps\cas\WEB-INF\view\jsp\default\ui下的视图文件

 




附上自定义验证的类:

/*    */ package cn.com.wz;
/*    */ 
/*    */ import java.io.PrintStream;
/*    */ import java.io.UnsupportedEncodingException;
/*    */ import java.security.MessageDigest;
/*    */ import java.security.NoSuchAlgorithmException;
/*    */ import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler;
/*    */ import org.jasig.cas.authentication.handler.AuthenticationException;
/*    */ import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
/*    */ import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
/*    */ import sun.misc.BASE64Encoder;
/*    */ 
/*    */ public class encodePasswordHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler
/*    */ {
/*    */   protected boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials)
/*    */     throws AuthenticationException
/*    */   {
/* 21 */     String username = credentials.getUsername();
/* 22 */     String password = credentials.getPassword();
/* 23 */     String savedPassword = (String)getJdbcTemplate().queryForObject("select password from sys_user where user_name=?", String.class, new Object[] { username });
/* 24 */     MessageDigest md = null;
/*    */     try {
/* 26 */       md = MessageDigest.getInstance("SHA");
/* 27 */       md.update(password.getBytes("UTF-8"));
/* 28 */       String encodePassword = new BASE64Encoder().encode(md.digest());
/* 29 */       System.out.println("数据库中的密码为" + savedPassword + ";加密后的密码为:" + encodePassword);
/* 30 */       if (encodePassword.equals(savedPassword)) {
/* 31 */         System.out.println("验证成功!");
/* 32 */         return true;
/*    */       }
/* 34 */       System.out.println("验证失败!");
/* 35 */       return false;
/*    */     }
/*    */     catch (NoSuchAlgorithmException e) {
/* 38 */       e.printStackTrace();
/*    */     } catch (UnsupportedEncodingException e) {
/* 40 */       e.printStackTrace();
/*    */     }
/*    */ 
/* 44 */     return false;
/*    */   }
/*    */ }


你可能感兴趣的:(SSO)