- 浏览: 88771 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
851228082:
怎样控制字符的坐标?
验证码之SimpleCaptcha (一) -
宋健skipper:
新版本有问题啊 连struts.xml文件都没了 找不到log ...
小型用户权限例子struts2.18+spring3.0+hibernate3.5+annotation(源码) -
宋健skipper:
新下载的版本 ops.sql文件缺少了 use 'ops'; ...
小型用户权限例子struts2.18+spring3.0+hibernate3.5+annotation(源码) -
good_ovo:
很实用的一个框架,里面封装东西挺齐全的,多谢楼主共享
小型用户权限例子struts2.18+spring3.0+hibernate3.5+annotation(源码) -
玉无瑕:
非常好, 可以作基本信息管理的框架!
小型用户权限例子struts2.18+spring3.0+hibernate3.5+annotation(源码)
Cas整合UcCenter数据库
CAS:为Web应用系统提供了单点登录服务。它的特性包括:一个开放和具有很好文档支持的协议;一个Java开源服务器组件;提供多种类型的客户端包括Java、.Net、PHP、Perl、Apache、uPortal等;能够与uPortal、BlueSocket、TikiWiki、Mule、 Liferay、Moodle集成使用。
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 Cookie(TGC),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进行解压到tomcat的webapps目录下.
将刚才解压出的目录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>
|
重启后输入用户名和密码登陆。这里整合的是discuz,discuz的密码进行了加密,我们还得附加加密功能。
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 <路径列表>]
发表评论
-
模板之freemarker
2012-02-23 10:01 2307FreeMarker是一个模板引擎,一个基于模板生成文 ... -
报表之fusionchart
2011-01-13 22:27 3549java做web报表主要分为三类,一种在服务器生成 ... -
小型用户权限例子struts2.18+spring3.0+hibernate3.5+annotation(源码)
2010-12-31 15:08 7593今天是2010年的最后一天,在此分享一下个人几个月前 ... -
缓存之EHcache
2010-12-01 19:25 2585EhCache 是一个纯Java的进程内缓存框架,具有快速、精 ... -
java之图片处理
2010-11-17 18:26 3571package com.xyj.com.tool.util; ... -
Excel之POI
2010-11-05 13:03 5574java操作Excel最常用的开源组件有poi与jxl。jxl ... -
xml之dom4j
2010-10-27 20:31 1928Dom4j是一个易用的、开源的库,用于XML,XPath和XS ... -
汉语转拼音之pinyin4j
2010-10-21 22:11 3254汉字转成拼音如果自己实现起来有点麻烦,主要是怕有些 ... -
验证码之SimpleCaptcha (二)
2010-10-21 00:07 5452上回说到了简单的使用simpleCaptcha,这 ... -
验证码之SimpleCaptcha (一)
2010-10-20 23:46 3624在captcha中,两个比较著名的框架验证码有Jca ... -
CAS学习
2010-07-10 15:13 3204CAS学习 ...
相关推荐
H3C CAS V2V离线迁移操作指南 H3C CAS V2V离线迁移操作指南是一份详细的操作指南,旨在指导用户如何使用H3C CAS云计算管理平台进行虚拟机离线迁移。该指南涵盖了迁移前的准备工作、迁移过程和后续操作等多个方面。 ...
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 转换文件 windows 版本
连接cas2 用于Express / Connect的CAS客户端中间件的完整实现,支持CAS 2.0+协议。 CAS(中央身份验证服务)是Web的单点登录/单点退出协议。 我们假设您已经熟悉CAS协议,如果不熟悉,请在使用前阅读本。 安装 ...
2. **服务验证**:客户端会向CAS服务器验证服务票据,确保用户已成功认证。 3. **代理认证**:对于需要代表用户进行操作的服务,CAS支持代理票据功能。 4. **集成库**:提供了各种编程语言的客户端库,如Java、.NET...
2. **数据备份**:在进行P2V转换前,务必对原始物理服务器进行完整的数据备份,以防转换过程中可能出现的意外情况。 3. **网络配置**:在迁移过程中,网络配置的正确设置至关重要,包括IP地址、网关、DNS等,以确保...
2. CAS Client检测到用户未认证,将用户重定向至CAS Server的登录页面。 3. 用户在CAS Server上提交用户名和密码。 4. CAS Server验证用户凭证,成功后生成一个Service Ticket。 5. 用户携带Service Ticket返回到CAS...
2. **下载CAS**:从官方仓库获取CAS4.2.7的源码或二进制包。 3. **构建与部署**:使用Maven或者其他构建工具进行构建,并将构建后的WAR文件部署到Web容器中。 4. **配置文件**:修改`cas.properties`和`...
cas-peal人脸库注册子集,如果积分不够,可发送邮件到hudalikm@163.com索取
西门子WinCC V7.0和WinCC/CAS V7.0的SP2版本是西门子公司推出的系统软件更新包,用于增强和修正原有WinCC软件的功能和性能。SP是Service Pack的缩写,是软件升级包的常用表示方式,它通常包含了一系列的软件改进和...
4. **协议支持**:CAS支持多种协议,如CAS1、CAS2、CAS3、SAML1.1和OpenID等,其中CAS2是最常用的一种,提供了基于HTTP的POST和GET方式的身份验证。 5. **扩展性**:CAS的设计允许开发者轻松地添加新的身份验证机制...
在4.0.0版本中,它支持了多种协议版本,包括CAS1、CAS2、CAS3以及SAML1.1。 3. **服务管理**:CAS提供了一个服务注册中心,用于管理和注册所有需要SSO保护的应用。管理员可以通过Web界面或API来添加、删除和修改...
2、 CAS Server服务端和客户端的搭建和配置 3、 单点登录和单点登出的实现和测试 4、 单点登录、登出的原理探究等 知识点 l 相关概念或术语:SSO、CAS、TGT、TGC、ST l CAS Server服务端的搭建和配置 l CAS Client...
6. **CasProtocol**: CAS支持多种协议,如CAS1、CAS2、CAS3和SAML1.1等。不同的协议会影响票证的格式和验证过程。CAS 3.1.12可能支持其中的几种或全部。 在解压"cas-client-3.1.12"文件后,你会看到源码结构,包括...
3. **CAS协议**:CAS支持多种协议,如原始的CAS协议、CAS2、CAS3以及CAS SAMLv2.0等。在3.5.2版本中,可能主要使用的是CAS3,它增加了服务票证(Service Ticket)和代理票证(Proxy Ticket)的概念,增强了安全性。 ...
Struts2和CAS单点登录(SSO)的集成是一个常见的Web应用安全实践,它允许用户在一个系统登录后,无须再次输入凭证就能访问其他相互信任的系统。在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与...
2. **CAS客户端配置**: CAS客户端是与CAS服务器通信的应用程序,负责用户的登录、登出以及票证验证。压缩包中包含的文档将指导你如何配置CAS客户端,包括在Spring或Web.xml中添加必要的配置项,设置服务URL,以及...
2. **服务票证(Service Ticket)**:这是CAS服务器为特定的服务(如Web应用)生成的一次性凭证,表示用户已经通过了身份验证。服务票证被提交到CAS服务器进行验证。 3. **代理票证(Proxy Ticket)**:在某些情况...
CAS 3是其第三个主要版本,针对CAS 2的局限性和新的需求进行了重大改进。 在CAS 2时代,系统设计相对简单易懂,主要包括6个Servlet和不到10个JSP页面。它的认证包(Auth package)为用户提供了插入自定义认证提供者...