`
xiaoxin5230
  • 浏览: 88877 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

CAS(2)

    博客分类:
  • j2ee
阅读更多

                              Cas整合UcCenter数据库

CASWeb应用系统提供了单点登录服务。它的特性包括:一个开放和具有很好文档支持的协议;一个Java开源服务器组件;提供多种类型的客户端包括Java.NetPHPPerlApacheuPortal等;能够与uPortalBlueSocketTikiWikiMule LiferayMoodle集成使用。

Cas原理和协议:

从结构上来看cas包含两部分:cas server cas Client .casServer需要独立部署,主要负责对用户的认证工作,cas client负责对客户端受保护资源的访问请求。需要登录时,重定向到cas服务器

CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted CookieTGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。

在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。

配置cas server:

1.    下载cas

http://www.jasig.org/cas_server_3_4_2_1

下载最新的cas_server_3_4_2_1.zip 服务器端,解压后找到cas-server-3.4.2.1-release\cas-server-3.4.2.1\modules\cas-server-webapp.war,将这个war进行解压到tomcatwebapps目录下.

将刚才解压出的目录cas-server-webapp进行重命名为cas

启动tomcat 输入http://localhost:8080/cas/login 查看是否成功部署

 

默认的认证方式是用户名和密码相同则认证成功。这个肯定是不能满足项目的需求的,所以需要和用户数据库配置起来

2.配置数据库

首先的将一些包导入进来,这里使用的是dbcp来配置数据库

 

将上述包拷贝到cas\WEB-INF\lib

 cas-server-support-jdbc-3.4.2.1.jar包中,提供了 3 个基于 JDBC  AuthenticationHandler,分别为BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler

我们这里使用的是QueryDatabaseAuthenticationHandler,它是通过配置一个 SQL 语句查出密码

打开文件cas/WEB-INF/deployerConfigContext.xml,找到

<bean

class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

 

 

将它替换为

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

    <property name="sql" value="select password from uc_members where lower(username)=lower(?)"/>              

       <property name="dataSource">

       <ref local="dataSource"/>

       </property> 

</bean>

                             

 

并在最后加入

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

                     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

                     <property name="url" value="jdbc:mysql://localhost:3306/ucenter"/>

                     <property name="username" value="root" />

                     <property name="password" value="123" />

                     <property name="maxActive" value="20"/>

                     <property name="maxIdle" value="20"/>

                     <property name="maxWait" value="20"/>   

      </bean>

                             

重启后输入用户名和密码登陆。这里整合的是discuzdiscuz的密码进行了加密,我们还得附加加密功能。

3.加密
分析:公司使用的是discuz6.1.用户密码使用的是MD5(MD5+salt(重数据库取出的随机数)) 所以现在认证就不能使用QueryDatabaseAuthenticationHandler,从而必须重写CAS的密码校验模块
步骤:1.实现

package org.jasig.cas.authentication.handler.support;

 

 

import java.util.List;

import java.util.Map;

 

import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler; 

import org.jasig.cas.authentication.handler.AuthenticationException; 

import org.jasig.cas.authentication.handler.BadPasswordAuthenticationException; 

import org.jasig.cas.authentication.handler.UnknownUsernameAuthenticationException; 

import org.jasig.cas.authentication.principal.UsernamePasswordCredentials; 

import org.springframework.dao.IncorrectResultSizeDataAccessException; 

import org.springframework.jdbc.core.BeanPropertyRowMapper; 

import org.springframework.jdbc.core.JdbcTemplate; 

import org.springframework.jdbc.support.rowset.SqlRowSet;

 

/**

 * @className:JdbcUsernamePasswordAuthHandlerImpl.java

 * @classDescription:

 * @author:xiayingjie

 * @createTime:2010-8-11

 */

public class JdbcUsernamePasswordAuthHandlerImpl extends AbstractJdbcUsernamePasswordAuthenticationHandler { 

 

              

    // it's better to move below properties to external configure file, for example 'maxFailureTimes' 

    private static final String QUERY_USER_SQL = "select salt,password from uc_members where username = ?"; 

 

 

 

    /**

     * authenticate username password internal

     *

     * @param credentials

     *            credentials

     * @throws AuthenticationException

     *             AuthenticationException

     * @return true if user login success

     * @see org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler

     *      #authenticateUsernamePasswordInternal(rg.jasig.cas.authentication.principal.UsernamePasswordCredentials)

     */ 

    @Override 

    protected boolean authenticateUsernamePasswordInternal(final UsernamePasswordCredentials credentials) 

        throws AuthenticationException { 

        final String username = credentials.getUsername(); 

        final String password = credentials.getPassword(); 

        JdbcTemplate template = new JdbcTemplate(getDataSource()); 

 

        try { 

 

          Map mp= template.queryForMap(QUERY_USER_SQL, new String[]{username});

         

          String salt=(String) mp.get("salt");

          String userPassword=(String) mp.get("password");

 

          String cPassword=MD5.getInstance().createMD5(MD5.getInstance().createMD5(password)+salt);

         

          if(cPassword.equals(userPassword)){

              return true;

          } else{                               

              return false;

          }

 

        } catch (final IncorrectResultSizeDataAccessException e) { 

            // this means the username was not found. 

            throw new UnknownUsernameAuthenticationException(); 

        } 

    } 

 

} 

 

其中里面使用了MD5,这个类是从网上随便找的一个
package org.jasig.cas.authentication.handler.support;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
 private MessageDigest md;
 private static MD5 md5;
 private MD5()
 {
  try {
   md=MessageDigest.getInstance("md5");
  } catch (NoSuchAlgorithmException e) {
   System.out.println("没有这种算法");
  }
 }
 //产生一个MD5实例
 public static MD5 getInstance()
 {
  if(null!=md5)
   return md5;
  else
  {
   makeInstance();
   return md5;
  }
 }
 //保证同一时间只有一个线程在使用MD5加密
 private static synchronized void makeInstance()
 {
  if(null==md5)
   md5=new MD5();
 }
 
 public String createMD5(String pass)
 {
  md.update(pass.getBytes());
  byte[] b=md.digest();
  return byteToHexString(b);
 }
 private String byteToHexString(byte[] b)
 {
  StringBuffer sb=new StringBuffer();
  String temp="";
  for(int i=0;i<b.length;i++)
  {
   temp=Integer.toHexString(b[i]&0Xff);
   if(temp.length()==1)
    temp="0"+temp;
   sb.append(temp);
  }
  return sb.toString();
 }
 public static void main(String[] args) {
  System.out.println(MD5.getInstance().createMD5((MD5.getInstance().createMD5("asdf")+"e61bb7")));
 }
}
 
修改认证方式:
修改cas部署包下的WEB-INF目录下的deployerConfigContext.xml
<property name="authenticationHandlers">
<list>
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" />
<bean class="org.jasig.cas.authentication.handler.support.JdbcUsernamePasswordAuthHandlerImpl">  
              <property name="dataSource" ref="dataSource" />  
 </bean> 
</list>
</property>
到此cas整合discuz加密已经全部完成。。
5. Tomcat SSL安全验证

如果要实现CAS的单点登入,这是必须的

1.       生产密钥

2.       点击开始’ ’运行,输入cmd

CD  X:\jdk根目录\Java\jdk1.6.0_14\bin

CD X:

 

打开系统的hosts文件,我们定义2个解析

127.0.0.1                   casserver

127.0.0.1                   server1

下文中导入过程密码统一使用password

keytool -genkey -alias cas-server -keyalg RSA -keypass password -storepass password -keystore casserver.keystore

输入密码后,在第一个提示输入姓名(CN)的时候,输入你的CAS服务端域名或者hosts文件里定义的映射,casserver

 

国家(C)输入CN

 

keytool -export -alias cas-server -storepass password -file casserver.cer -keystore  casserver.keystore

 

 

 

 

 

keytool -import -trustcacerts -alias server -file casserver.cer -keystore “jre根目录/lib/security/cacerts “ -storepass changeit  

(keytool -import -trustcacerts -alias server -file casserver.cer -keystore cacerts  -storepass changeit  )

注意,这个 changeit cacerts 文件(密钥库)的密码,不是刚才设置的密钥密码,  changeit 为密钥库的默认密码

如果操作成功,会在jdk bin目录下看到casserver.cer  casserver.keystore 这两个文件

如果项目中已经存在证书 则删除证书

keytool -delete -alias server -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit

keytool -delete -alias server -keystore cacerts -storepass changeit

 

打开tomcat目录下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"

maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" disableUploadTimeout="true"

acceptCount="100" scheme="https" secure="false"

clientAuth="false" sslProtocol="TLS"

keystoreFile=" casserver.keystore所在的目录\casserver.keystore" keystorePass="password"

         truststoreFile="jre目录/lib/security/cacerts" truststorePass="changeit"

/>

 

 

 

默认的密钥有效期是3个月,可以根据自己需求修改

访问https://casserver:8443/cas/login 测试是否部署成功

 

6. keytool用法

keytool 用法:

-certreq     [-v] [-protected]

             [-alias <别名>] [-sigalg <sigalg>]

             [-file <csr_file>] [-keypass <密钥库口令>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]]  

             [-providerpath <路径列表>]

-changealias [-v] [-protected] -alias <别名> -destalias <目标别名>

             [-keypass <密钥库口令>]

 

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]]

             [-providerpath <路径列表>]

-delete      [-v] [-protected] -alias <别名>

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]]

             [-providerpath <路径列表>]

-exportcert  [-v] [-rfc] [-protected]

             [-alias <别名>] [-file <认证文件>]

             [-keystore <密钥库>] [-storepass <存储库口令>]

             [-storetype <存储类型>] [-providername <名称>]

             [-providerclass <提供方类名称> [-providerarg <参数>]]

             [-providerpath <路径列表>]

分享到:
评论

相关推荐

    H3C CAS V2V离线迁移操作指南.pdf

    H3C CAS V2V离线迁移操作指南 H3C CAS V2V离线迁移操作指南是一份详细的操作指南,旨在指导用户如何使用H3C CAS云计算管理平台进行虚拟机离线迁移。该指南涵盖了迁移前的准备工作、迁移过程和后续操作等多个方面。 ...

    H3C_CAS_P2V_Converter工具使用指南_–_Linux篇

    2. 执行命令`tar -xzvf h3c-cas-convert-xxx.tar.gz`进行解包,生成h3c-cas-convert-xxx目录。 3. 执行`cd h3c-cas-convert-xxx`进入该目录。 4. 执行安装脚本`sh h3c_cas_convert_install.sh`开始安装过程。 5. ...

    h3c cas p2v 转换文件

    h3c cas p2v 转换文件 windows 版本

    connect-cas2:CAS(中央身份验证服务)客户端的NodeJS实现

    连接cas2 用于Express / Connect的CAS客户端中间件的完整实现,支持CAS 2.0+协议。 CAS(中央身份验证服务)是Web的单点登录/单点退出协议。 我们假设您已经熟悉CAS协议,如果不熟悉,请在使用前阅读本。 安装 ...

    P2v-linux迁移(从物理机迁移到虚拟机)

    [root@localhost h3c-cas-convert-1.1.0]# sh h3c_cas_convert_install.sh ``` 安装完成后,进入相应目录,准备开始迁移: ``` [root@localhost h3c-cas-convert-1.1.0]# cd h3c-cas-convert/ ``` 二、P2V-Linux ...

    H3C CAS-P2V-converter工具-Linux.rar

    2. **数据备份**:在进行P2V转换前,务必对原始物理服务器进行完整的数据备份,以防转换过程中可能出现的意外情况。 3. **网络配置**:在迁移过程中,网络配置的正确设置至关重要,包括IP地址、网关、DNS等,以确保...

    cas-server-3.4.10-release和cas-client-3.2.1-release两个

    2. **服务验证**:客户端会向CAS服务器验证服务票据,确保用户已成功认证。 3. **代理认证**:对于需要代表用户进行操作的服务,CAS支持代理票据功能。 4. **集成库**:提供了各种编程语言的客户端库,如Java、.NET...

    CAS SSO 原理

    2. CAS Client检测到用户未认证,将用户重定向至CAS Server的登录页面。 3. 用户在CAS Server上提交用户名和密码。 4. CAS Server验证用户凭证,成功后生成一个Service Ticket。 5. 用户携带Service Ticket返回到CAS...

    CAS4.2.7文档 html版本

    2. **下载CAS**:从官方仓库获取CAS4.2.7的源码或二进制包。 3. **构建与部署**:使用Maven或者其他构建工具进行构建,并将构建后的WAR文件部署到Web容器中。 4. **配置文件**:修改`cas.properties`和`...

    cas-peal人脸库注册集

    cas-peal人脸库注册子集,如果积分不够,可发送邮件到hudalikm@163.com索取

    WinCC V7.0和WinCC/CAS V7.0的SP2.pdf

    西门子WinCC V7.0和WinCC/CAS V7.0的SP2版本是西门子公司推出的系统软件更新包,用于增强和修正原有WinCC软件的功能和性能。SP是Service Pack的缩写,是软件升级包的常用表示方式,它通常包含了一系列的软件改进和...

    cas 服务端源码

    4. **协议支持**:CAS支持多种协议,如CAS1、CAS2、CAS3、SAML1.1和OpenID等,其中CAS2是最常用的一种,提供了基于HTTP的POST和GET方式的身份验证。 5. **扩展性**:CAS的设计允许开发者轻松地添加新的身份验证机制...

    cas-server-4.0.0-release.rar

    在4.0.0版本中,它支持了多种协议版本,包括CAS1、CAS2、CAS3以及SAML1.1。 3. **服务管理**:CAS提供了一个服务注册中心,用于管理和注册所有需要SSO保护的应用。管理员可以通过Web界面或API来添加、删除和修改...

    Java进阶SSO单点登录技术CAS-快速上手与原理探究视频教程

    2、 CAS Server服务端和客户端的搭建和配置 3、 单点登录和单点登出的实现和测试 4、 单点登录、登出的原理探究等 知识点 l 相关概念或术语:SSO、CAS、TGT、TGC、ST l CAS Server服务端的搭建和配置 l CAS Client...

    cas-client-3.1.12-release.tar.gz

    6. **CasProtocol**: CAS支持多种协议,如CAS1、CAS2、CAS3和SAML1.1等。不同的协议会影响票证的格式和验证过程。CAS 3.1.12可能支持其中的几种或全部。 在解压"cas-client-3.1.12"文件后,你会看到源码结构,包括...

    cas-server-3.5.2-release.rar

    3. **CAS协议**:CAS支持多种协议,如原始的CAS协议、CAS2、CAS3以及CAS SAMLv2.0等。在3.5.2版本中,可能主要使用的是CAS3,它增加了服务票证(Service Ticket)和代理票证(Proxy Ticket)的概念,增强了安全性。 ...

    struts2+cas单点登陆例子

    Struts2和CAS单点登录(SSO)的集成是一个常见的Web应用安全实践,它允许用户在一个系统登录后,无须再次输入凭证就能访问其他相互信任的系统。在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与...

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    2. **CAS客户端配置**: CAS客户端是与CAS服务器通信的应用程序,负责用户的登录、登出以及票证验证。压缩包中包含的文档将指导你如何配置CAS客户端,包括在Spring或Web.xml中添加必要的配置项,设置服务URL,以及...

Global site tag (gtag.js) - Google Analytics