`

在CAS架设中遇到的问题和我的解决方案

    博客分类:
  • SSO
阅读更多
工作需要,对CAS进行了研究,网络上看了些文章,但都不完善,自己就写了一篇。
我在CAS部署过程中遇到了几个问题,主要是中文乱码的问题,毕竟是外国人写的东西。对中文的支持不好。
相关的jar包可以在www.apache.org  www.jasig.org  www.springsource.org上找到。
在CAS架设中遇到的问题和我的解决方案
1.在CAS服务端用户登入如果是中文请求会乱码的问题
解决方案:CAS利用到spring,spring框架中提供了编码过滤功能,利用它可以解决请求乱码问题
2.CAS客户端和服务端中文传输乱码问题,虽然请求乱码问题解决了,但是这个问题还是会存在,可能是数据传输过程中引起的
解决方案:BASE64服务端加密,客户端解密(O(∩_∩)O~偶突发奇想来的)
3.中心同一个服务器,机房和办公室访问地址不同的问题(有的网站一个服务器有多个域名)
解决方案:重写CAS客户端CASFilter类,请注意,我们中心的CAS客户端和CAS服务端在同一服务器上的,我是针对这环境下写的
CAS架设环境
Windows
Tomcat 6.x
JDK 1.6
CAS server 3.34
cas-client-2.0.11(是耶鲁大学的那个版本,不是最新版,最新不一定最好,下载时请注意)

配置CAS服务端
部署cas-server
下载最新的cas-server-3.3.4.zip 服务器端,解压后找到cas-server-webapp.war,将这个war进行解压到tomcat的webapps目录下.
将刚才解压出的目录cas-server-webapp进行重命名为cas
启动tomcat 输入http://localhost:8080/cas/login 查看是否成功部署
下载地址: http://www.jasig.org/
推荐环境:JDK1.6 tomcat 6.0
配置数据源和身份验证
用户的认证信息通常保存在数据库中,我们这里使用的是jtds数据库连接。
将前面下载的cas-server-3.3.4.zip 包解开后,在 modules 目录下可以找到包cas-server-support-jdbc-3.3.4.jar,再下载个jtds的jar包,将两个包拷贝到cas\WEB-INF\lib目录下
DataStore 依赖于 spring.jar, commons-collections.jar, commons-dbcp.jar, commons-pool.jar
在apache和spring官方网找到这四个包把它们拷贝到cas\WEB-INF\lib下

在 cas-server-support-jdbc-3.3.4.jar包中,提供了 3 个基于 JDBC 的 AuthenticationHandler,分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler
我们这里使用的是QueryDatabaseAuthenticationHandler,它是通过配置一个 SQL 语句查出密码,与所给密码匹配

根据密码加密方式的不同,我们需要实现PasswordEncoder接口,来对输入的密码进行加密才能与数据库中的密码比较

建立一个项目,导入cas-server-core-3.3.4.jar包
在项目中写个类实现org.jasig.cas.authentication.handler.PasswordEncoder接口中的public String encode(String arg0)方法,这是用来输入的密码加密的。
项目导出成jar包,拷贝到cas\WEB-INF\lib下



根据不同的密码加密方式实现,我这里是MD5加密,下文仅为参考,请根据需求变化
新建个caspasskey项目
源码为
package org;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

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

public class MD5 implements PasswordEncoder {

@Override
public String encode(String arg0) {
MessageDigest digest = null;
if (digest == null) {
try {

digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {

nsae.printStackTrace();
}
}
// Now, compute hash.
digest.update(arg0.getBytes());


byte[] bytes=digest.digest();
StringBuffer buf = new StringBuffer(bytes.length * 2);
for (int i= 0; i < bytes.length; i++) {
if (((int) bytes[i] & 0xff) < 0x10) {
buf.append("0");
}
buf.append(Long.toString((int) bytes[i] & 0xff, 16));
}
return buf.toString().toUpperCase();
}

}

导出为caspasskey.jar,拷贝到cas/WEB-INF/lib目录下


打开文件cas/WEB-INF/deployerConfigContext.xml,
找到
<bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
将它替换为
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="casDataSource" />
  <property name="sql"        
      value="select 密码 from 用户表 where lower([用户名]) = UPPER(?)" /> 
      <property  name="passwordEncoder"  ref="myPasswordEncoder"/></bean>

  <bean id="myPasswordEncoder"    class="org.MD5"/>  ---org.MD5这是我上文自定义的加密类


找到
<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl" />在它的下方添加以下数据源代码
<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">    
<property name="driverClassName">       
<value>net.sourceforge.jtds.jdbc.Driver</value>
  </property>   
       <property name="url">
<value>jdbc:jtds:sqlserver://数据库地址:1433/数据库名</value>
         </property>     <property name="username">
          <value>数据库访问用户名</value>     </property>  
            <property name="password">
              <value>数据库访问密码</value>
              </property>
              </bean>

到此,数据库与cas服务端的连接已完成,登入http://localhost:8080/cas/login,用英文的用户名测试登入是否成功!

CAS服务端提交表单utf-8中文乱码解决方案
中文的用户名登入,默认情况下是乱码的,因为cas没有对请求进行utf-8编码
cas用到了spring的框架,我们可以直接利用spring的编码器进行utf-8编码
在web.xml中添加
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

需要注意的是,此配置需要在 <filter-mapping>
<filter-name>CAS Client Info Logging Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>的上方

再测试,发现中文可以登入了。

中文用户名客户端乱码解决方案
因为cas默认对中文是不支持的,在cas服务端与客户端之间,如果有中文存在,会有中文乱码的问题,虽然上文对请求进行了编码,但是客户端中文乱码的问题始终存在。为了避免中文乱码的存在,我的临时解决方案是在服务器端对中文进行base64加密,在客户端进行base64解密

找到org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver类的源代码,这个类在cas-server-core-3.3.4.jar包中
找到 protected String extractPrincipalId(final Credentials credentials)方法,将
return usernamePasswordCredentials.getUsername();
改为
return (new sun.misc.BASE64Encoder()).encode(usernamePasswordCredentials.getUsername().getBytes());

这样就可以在服务器端对所有用户名进行base64加密了

服务器端配置到此结束

Tomcat SSL安全验证
如果要实现CAS的单点登入,这是必须的

1. 生产密钥
点击’开始’à’运行’,输入cmd
进入控制台
Ø CD  X:\jdk根目录\Java\jdk1.6.0_14\bin
Ø CD X:
Ø 下文中导入过程密码统一使用changeit
keytool -genkey -alias cas-server -keyalg RSA -keypass changeit -storepass changeit -keystore casserver.keystore
输入密码后,在第一个提示输入姓名的时候,输入你的服务端地址或ip地址,如localhost
国家输入CN
keytool -export -alias cas-server  -storepass changeit -file casserver.cer -keystore  casserver.keystore


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

如果操作成功,会在jdk bin目录下看到casserver.cer  casserver.keystore 这两个文件
打开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=" x:\casserver.keystore 所在的目录\casserver.keystore" keystorePass="changeit"
/>

默认的密钥有效期是3个月,可以根据自己需求修改
访问https://localhost:8443/cas/login 测试是否部署成功

CAS客户端配置
CAS客户端配置非常的简单,但这里需要进行些修改
以下是官方文档中客户端web.xml中配置
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://compA:8443/cas/login</param-value><!—compA是cas服务器的地址à
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://compA:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>compA:8080</param-value><!—注意,这里compA是cas客户端的地址à
</init-param>
</filter>

<filter-mapping>
<filter-name>CAS Filter</filter-name>
<!—对访问/servlet/HelloWorldExample 进行拦截,转向cas服务器端验证à
<url-pattern>/servlet/HelloWorldExample</url-pattern>
</filter-mapping>

因为我们中心的网络环境原因,机房和办公室访问同一台服务器的地址是不同的,所以需要对CASFilter类的源代码进行更改。注意,此设置修改仅对于CAS客户端和cas服务端在同一服务器时
下载cas-client-2.0.11.zip解压导入源码,修改edu.yale.its.tp.cas.client.filter.CASFilter类
注意:不要太高版本,2.0x是耶鲁的版本,高版本是jasig的,实现的步骤全都变了.

1. 声明两个属性
private String casclientport,casserverport;
2. 在init方法中添加
casclientport = config.getInitParameter(
                "edu.yale.its.tp.cas.client.filter.port");
casserverport = config.getInitParameter(
    "edu.yale.its.tp.cas.server.filter.port");
这是我自定义的,用来在xml中指定自定义的端口号
3. 在doFilter方法中添加
    casLogin="https://"+request.getServerName()+":"+casserverport+"/cas/login";//cas服务器的登入地址 request.getServerName()是可以根据客户访问的服务器端地址不同而变化的
casServerName=request.getServerName()+":"+casclientport;//注意,这是cas客户端的地址
    casValidate="https://"+request.getServerName()+":"+casserverport+"/cas/serviceValidate";//cas服务器的验证地址

修改客户端web.xml
<!-- CAS  -->
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>/cas/login</param-value><!-- 默认无需修改 -->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>/cas/serviceValidate</param-value><!-- 默认无需修改 -->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.port</param-name>
<param-value>8080</param-value><!-- 对应客户端端口号 -->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.server.filter.port</param-name>
<param-value>8443</param-value><!-- 对应服务器端口号 因为是ssl安全连接,所以是8443-->
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>localhost:8080</param-value><!-- 这是服务器端验证后访问客户端的地址-->
</init-param>
</filter>
<!-- 对访问/xxxxx的都进行拦截,并转向cas服务器,进行登入验证 -->
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/xxxxx</url-pattern>
</filter-mapping>
<!-- CAS end  -->
因为我们上文对中文在服务器端进行了base64加密,在客户端,就需要进行解密
还是对CASFilter类进行修改
在读doFilter方法中找到以下语句
        if (session != null) // probably unncessary
            session.setAttribute(CAS_FILTER_USER, user);
将它修改为
      if (session != null) // probably unncessary
        {
            session.setAttribute(CAS_FILTER_USER,  new String((new BASE64Decoder()).decodeBuffer(user)));
        }
这就是对base64加密的数据进行解密后再存放进客户端的session。

到此客户端存在的问题就解决了
测试在一个客户端已http://localhost:8080/客户端名/xxxxx


CAS权限认证我的方案

1. 我的理解是CAS主要解决用户登入的问题,权限上还是由各应用系统来分配的,用户在访问受限的页面时,通过过滤器判断CAS是否已登入过了,并且在客户端附加过了相关权限。
l 如果用户未登入过,则登入CAS服务端进行用户登入,登入后返回客户端,再根据用户名附加权限
l 如果用户cas服务端已登入过了,但是他是第一次登入客户端,则进入CAS服务端,获取登入的用户名,再返回客户端进行根据用户名附加权限
l 如果用户已登入了CAS并且附加了权限,则不在进入CAS服务端验证
 
全文到此结束,谢谢!

http://www.docin.com/p-49525085.html
分享到:
评论

相关推荐

    cas 单点登录 解决方案.

    cas 单点登录解决方案可以带来许多好处,但是也存在一些挑战和限制。例如,cas 单点登录解决方案需要高昂的投资和维护成本,需要专业的技术人员来维护和更新系统。 cas 单点登录解决方案是一个非常重要的解决方案,...

    CASClient集群环境的Session问题及解决方案.docx

    本文将详细介绍 CASClient 集群环境中的 Session 问题及解决方案。CASClient 是一种开源的单点登录系统,能够提供统一的登录和注销机制。但是在集群环境中应用 CASClient 时,可能会出现一些问题,例如 Session 信息...

    CAS下ABA问题及优化方案

    例如,在库存扣减业务中,用户1和用户2同时执行库存扣减操作,虽然都通过了CAS乐观锁机制的检查,但是在执行修改操作时,可能会出现数据不一致的情况。 二、ABA问题出现原因 ABA问题的出现原因是CAS乐观锁机制中,...

    基于CAS集群的单点失效问题解决方案

    通过引入基于CAS集群的单点登录系统,不仅能够有效解决单点登录系统中存在的单点失效问题,还能够显著提升系统的整体性能和可靠性。这对于大型企业和组织来说,是一项非常有价值的改进措施。未来的研究还可以探索更...

    构建和实现单点登录解决方案(CAS)

    在本主题中,我们将深入探讨如何构建和实现基于CAS(Central Authentication Service)的单点登录解决方案。 CAS是一个开源的SSO框架,它提供了安全的身份验证服务,使得用户只需一次登录即可访问多个应用。其核心...

    Roller4.0的另外一套cas简单解决方案

    我把自己碰到的问题和解决方案写出来和大家探讨一下.毕竟网上关于roller4的资料少之又少.对于cas的单点集成就更是少的可怜.我试验了一下roller自带的security.xml配置的cas方案.简直报错的夸张.根本没发用.roller...

    lifery6.1+cas初始化环境搭建及门户解决方案

    ### Liferay 6.1 + CAS 初始化环境搭建及门户解决方案 #### 一、Liferay 6.1 门户介绍 **1.1 简单介绍** Liferay是一款功能强大的开源门户平台,它包含了完整的J2EE应用。该平台不仅支持Web、EJB和JMS等技术,还...

    CAS实现内外网映射访问的解决办法

    然而,在实际的应用场景中,经常会遇到这样的问题:项目需要同时支持内外网访问,而CAS默认的服务地址通常是固定的,这在一定程度上限制了项目的部署灵活性。本文将详细介绍一种通过修改CAS源码来实现内外网访问的...

    统一身份认证(CAS)简单说明与设计方案

    在设计 CAS 解决方案时,需要考虑到以下几个方面:身份认证机制、授权机制、安全机制、可扩展性和可靠性。CAS 的设计需要满足企业的安全需求,保护用户的敏感信息,确保数据的安全传输和存储。 CAS 是一种功能强大...

    cas 中文 服务器端、客户端 乱码解决方案

    NULL 博文链接:https://jerry-doit.iteye.com/blog/724436

    H3C云计算CAS&亚信安全升级方案和疑难解答培训教程.rar

    在IT行业中,云计算技术的发展日新月异,而H3C作为国内领先的网络设备与解决方案提供商,其云计算产品H3C CAS(Cloud Architecture System)在业界有着广泛的应用。本教程聚焦于H3C CAS与亚信安全的整合,提供升级...

    idea 中导入cas

    值得注意的是,"修改了一天,终于搞定了"表明这个过程可能涉及一些特定的配置或问题解决,因此在实际操作时,遇到问题不要灰心,多查阅文档、社区问答和官方指南,通常都能找到解决方案。 总结起来,"idea中导入cas...

    CAS5.3.2Docker 部署方案

    CAS5.3.2Docker 部署方案CAS5.3.2Docker 部署方案CAS5.3.2Docker 部署方案

    H3Cloud云计算解决方案.pdf

    本解决方案主要介绍了H3Cloud云计算解决方案的概述、定位、应用场景、功能实现和卖点价值等内容。通过学习本课程,学习者将能够掌握H3Cloud云计算解决方案的知识点,包括云计算的基本概念、服务器虚拟化、IaaS云服务...

    cas官方文档

    这些解答有助于解决用户在实际操作中遇到的困扰,提高了问题解决的效率。 《Public APIs》文档则详细列出了CAS提供的公共API接口,这些接口可供开发者用来扩展CAS功能或者与其他系统集成。例如,API可能包含用户...

    phpCAS源码以及调用示例(redis管理session,解决无法logout的问题)

    本文将深入探讨phpCAS的源码和调用示例,特别是在使用Redis管理session以及解决无法正常logout问题方面的应用。 首先,理解phpCAS的工作原理至关重要。phpCAS是一个基于PHP的客户端库,它遵循CAS协议与CAS服务器...

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

    这部分文档提供了CAS的详细配置信息,包括服务器端和客户端的配置步骤,以及可能出现的问题和解决方案。它将指导你如何安装、启动CAS服务器,如何配置服务注册,以及如何处理各种认证和授权场景。 6. **CAS服务端...

    cas-server-3.5.1和cas-client-3.2.1

    在这个压缩包中,包含的是CAS服务器端3.5.1版本和客户端3.2.1版本的代码和相关依赖的jar文件。 首先,我们来看`cas-server-3.5.1`部分。这是CAS服务器端的核心组件,负责处理用户的认证请求和响应。3.5.1版本可能...

    单点登录解决方案-CAS

    总的来说,CAS作为单点登录解决方案,以其灵活性、安全性及易用性在IT领域得到广泛应用,帮助企业或组织构建高效的身份验证管理体系。了解并掌握CAS的原理和实践,对于提升系统的用户体验和安全管理具有重要意义。

    cas4.2.7 实现其他系统和cas互相认证互信

    3. **集成CAS客户端库**:在外部系统中,需要集成CAS客户端库,如Java CAS Client、Spring Security CAS等,它们负责处理与CAS服务器的交互,包括重定向用户到CAS登录页面、接收和验证服务票证。 4. **配置客户端...

Global site tag (gtag.js) - Google Analytics