- 浏览: 516862 次
- 性别:
- 来自: 宁波
-
文章分类
- 全部博客 (137)
- JQuery component (3)
- Web编程控件 (7)
- java (19)
- database (9)
- Web Service (6)
- XML (2)
- FTP (2)
- SSH2 (18)
- javascript (3)
- arcgis (7)
- geoserver (1)
- Openscales (2)
- FME (6)
- HttpClient (3)
- portal (6)
- oracle goldengate (7)
- oracle (3)
- 命令锦集 (1)
- web容器 (3)
- NB博客链接 (2)
- 设计模式 (0)
- ext (2)
- 小工具 (12)
- Flex (1)
- LINUX (1)
- Android (1)
- Maven 入门 (2)
- 负载均衡 (1)
- openlayers (2)
- Flexkkjk (0)
最新评论
-
lgh1992314:
ApplicationContext context = We ...
Spring中的ContextLoaderListener使用 -
lgh1992314:
ContextLoaderServletSpring3.0后删 ...
Spring中的ContextLoaderListener使用 -
gaoqiangjava:
...
Spring中的ContextLoaderListener使用 -
liude33:
好资料啊,网上这方面的资料好少。
goldengate 学习资料 -
AKka:
在实体类中加上@Transient 注解后,为什么还会在数据库 ...
JPA注解 转
工作需要,对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服务端验证
全文到此结束,谢谢!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cxy1238/archive/2009/10/11/4653345.aspx(转)
其他资料:
http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/(转)
发表评论
-
dwr 推送2
2013-12-22 23:17 01、>>>>>>> ... -
dwr 精准推送test
2013-12-15 23:07 0channelStatusMonitor_devChanne ... -
利用Object的wait、notify来实现线程同步原理 (转)
2012-11-21 22:46 1515认识Object.wait()方法: ... -
eclipse ant 编译 中文乱码问题
2012-11-19 15:22 3202eclipse ant 编译 中文乱码问题 在 javac 下 ... -
eclipse 离线安装SVN
2012-03-14 14:03 4445转 不知道因为是网络还是别的什么故障,在线安装svn插件方 ... -
win下 新建bat文件 启动 java应用服务
2011-12-09 14:17 1824rem --------------------------- ... -
异常备忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file
2011-07-31 23:17 904今天在导入一个工程时,编译并打包到Tomcat后,发现出现ja ... -
存在sql注入式攻击的最差实践代码(Java新手注意了)
2011-06-16 17:50 1342下面是自己以前初学JDBC时候写的代码,存在sql注入漏洞。 ... -
ext的myeclipse插件安装
2011-04-13 15:04 974http://www.spket.com/updat ... -
Map Area 让栅格地图动了起来
2011-03-28 17:22 2425当前的绝大部分地图网 ... -
VML 入门
2011-03-28 10:15 924http://www.itlearner.com/code/v ... -
SVG 入门
2011-03-16 17:07 877SVG 入门 http://helius1214.iteye ... -
MyEclipse编码&&其他设置
2011-03-12 15:02 1670http://www.blogjava.net/3ant/a ... -
字符串 与 java.sql.Timestamp转换
2011-03-11 14:34 12784package test; import java.sql. ... -
java Annotation 拼装SQL语句(转)
2011-02-15 09:40 1259import java.lang.annotation.Ele ... -
myeclipse6 .0 .1 注册码
2011-02-09 10:56 1069myeclipse6 .0 .1 注册码 vi ... -
封装jre安装程序
2010-12-23 11:56 1420封装jre安装程序 因为jre1.6u22安装程序的策略 ... -
applet访问本地资源,需要修改jre的java.policy
2010-12-23 11:54 3197Java Plug-in 1.6.0_22使用 JRE 版本 ... -
Java Annotation (二)
2010-06-02 22:42 1498首先分析jdk自带的java.lang.annot ... -
java Annotation 基础(转)
2010-06-02 21:56 1390Java 从1.5 ...
相关推荐
cas 单点登录解决方案 cas 单点登录解决方案是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。随着企业的发展,业务系统的数量...
基于Java中CAS的单点登录,有服务端的所有源码,将tomcat目录下的所有资源直接拷到Tomcat服务中间件的webapp目录下,阅读tomcat-webapp中的read.txt文档,查看使用说明,适用于第一次开发CAS单点登录的同学们,简单...
CAS单点登录CAS单点登录CAS单点登录CAS单点登录
CAS单点登录操作文档 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点: • 开源的企业级单点登录解决...
在本“CAS单点登录demo”中,我们将深入探讨CAS的工作原理、配置步骤以及如何实现客户端与服务器端的交互。 1. CAS工作原理: CAS的核心思想是集中式的身份验证,用户只需在一个地方进行登录,之后访问其他已经...
资源列表(1:cas CAS Server,2:Cas_Client_One 授权系统,3:graduationDesign 用户组织管理系统,4:CAS单点登录论文.doc,5:CAS单点登录文献综述.doc,6:基于CAS的用户管理单点登录门户系统ppt.ppt)
在这个"CAS单点登录安装笔记4 -- asp.net client端的设置"中,我们将深入探讨如何将ASP.NET应用程序配置为使用CAS服务器进行身份验证。 首先,要使ASP.NET客户端与CAS服务器协同工作,我们需要在客户端应用程序中...
总之,CAS单点登录系统提供了统一的身份验证入口,简化了用户登录过程,提高了用户体验。通过理解和实践CAS Server的配置以及客户端的集成,开发者可以有效地在自己的应用环境中实现单点登录功能。
在提供的PDF文件`cas单点登录(一).pdf`和`cas单点登录(二).pdf`中,应该详细涵盖了这些步骤,以及更深入的技术细节,包括可能出现的问题和解决方案。通过学习这些文档,你应该能够成功地配置和实施CAS单点登录...
本文在已有的禅道集成CAS单点登录的客户端插件基础上进行的修改,因原有插件在我们的系统上调试无法成功,做了一些定制,环境如下: 1. CAS server 版本:4.0.0 2. 禅道开源版本: 9.6.3 3. 禅道CAS client 插件版本...
CAS单点登录时序图,UML源码
CAS多数据库配置单点登录 CAS(Central Authentication Service)是一种流行的单点登录解决方案,能够提供安全、...通过了解CAS单点登录的原理和配置步骤,可以更好地应用CAS单点登录,提高企业应用的安全性和可靠性。
这个项目可能包含配置文件、控制器代码、视图模板和其他相关资源,展示了如何在实际应用中实现CAS单点登录功能。 综上所述,.NET CAS单点登录涉及到了身份验证、票证机制、客户端和服务器之间的交互等多个核心概念...
Struts2和CAS单点登录(SSO)的集成是一个常见的Web应用安全实践,它允许用户在一个系统登录后,无须再次输入凭证就能访问其他相互信任的系统。在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与...
cas单点登录的例子程序,运行见说明
**CAS单点登录配置大全** CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On,SSO)协议。它允许用户通过一个统一的认证系统访问多个应用系统,而无需在每个系统...
综上所述,这个压缩包提供了一个完整的CAS单点登录实例,包括服务端和客户端的实现,可以帮助开发者理解并部署自己的CAS系统。通过深入研究和实践,你可以掌握如何利用CAS实现Web应用的安全、便捷的单点登录功能。
**基于Cas的单点登录实现** 单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。它为用户提供了一种方便、高效的访问多系统的方式,同时减少...
本文将深入探讨CAS单点登录实例及其相关知识点。 首先,单点登录(Single Sign-On,SSO)是一种身份验证机制,使得用户在一个应用系统中登录后,无需再次输入认证信息即可访问其他关联的应用系统。CAS作为开源的SSO...