`
NoGrief
  • 浏览: 12533 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CXF 使用 UserName Token进行验证

阅读更多
网络当中搜索CXF Securiy的时候,有且只有一篇文章,所以决定自己写个可执行的demo放上来。
这次先放上网上盛传的那个demo,请勿转载,否则根本没法看了。
CXF相关介绍和接口就不介绍,直接上代码。

先放上wsdl,很简单,一个最简单的wsdl:
security.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="security"
	targetNamespace="http://demo.ti.tongtech.com/security/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	xmlns:tns="http://demo.ti.tongtech.com/security/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
	<wsdl:types>
		<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
			targetNamespace="http://demo.ti.tongtech.com/security/">
			<xsd:element name="input">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="in" type="xsd:string"></xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="inputResponse">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="out" type="xsd:string"></xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
		</xsd:schema>
	</wsdl:types>
	<wsdl:message name="inputRequest">
		<wsdl:part name="parameters" element="tns:input"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="inputResponse">
		<wsdl:part name="parameters" element="tns:inputResponse"></wsdl:part>
	</wsdl:message>
	<wsdl:portType name="ISecuriyDemo">
		<wsdl:operation name="input">
			<wsdl:input message="tns:inputRequest"></wsdl:input>
			<wsdl:output message="tns:inputResponse"></wsdl:output>
		</wsdl:operation>
	</wsdl:portType>
	<wsdl:binding name="ISecurityBinding" type="tns:ISecuriyDemo">
		<soap:binding style="document"
			transport="http://schemas.xmlsoap.org/soap/http" />
		<wsdl:operation name="input">
			<soap:operation soapAction="http://demo.ti.tongtech.com/security/input" />
			<wsdl:input>
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	<wsdl:service name="ISecuriyService">
		<wsdl:port name="ISecuriyServicePort" binding="tns:ISecurityBinding">
			<soap:address location="http://localhost:8080/sec" />
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>


使用cxf的wsdl2java生成服务接口和服务器端、客户端代码,这里我就不多说了,一会贴上maven的pom文件。

然后写客户端程序
Client.java
package com.tongtech.ti.demo.security.ut.client;

/**
 * Please modify this class to meet your needs
 * This class is not complete
 */

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import javax.xml.namespace.QName;

import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.handler.WSHandlerConstants;

import com.tongtech.ti.demo.security.service.ISecuriyDemo;
import com.tongtech.ti.demo.security.service.ISecuriyService;

/**
 * This class was generated by Apache CXF 2.4.0-SNAPSHOT Fri Oct 22 15:44:43 CST
 * 2010 Generated source version: 2.4.0-SNAPSHOT
 * 
 */

public final class Client {

	private static final QName SERVICE_NAME = new QName(
			"http://demo.ti.tongtech.com/security/", "ISecuriyService");

	private Client() {
	}

	public static void main(String args[]) throws Exception {
		URL wsdlURL = ISecuriyService.WSDL_LOCATION;
		
		//获取endpoint,并加入WSS4J的Intercepter
		ISecuriyService ss = new ISecuriyService(wsdlURL, SERVICE_NAME);
		ISecuriyDemo port = ss.getISecuriyServicePort();
		Map<String, Object> outProp = new HashMap<String, Object>();
		outProp
				.put(WSHandlerConstants.ACTION,
						WSHandlerConstants.USERNAME_TOKEN);
		outProp.put(WSHandlerConstants.USER, "SecuriyUserName");
		outProp.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
		outProp.put(WSHandlerConstants.PW_CALLBACK_CLASS,
				UTPasswordClientCallBack.class.getName());
		
		org.apache.cxf.endpoint.Client client = ClientProxy.getClient(port);
		Endpoint cxfEp = client.getEndpoint();
		cxfEp.getOutInterceptors().add(new WSS4JOutInterceptor(outProp));

		//调用服务接口
		{
			System.out.println("Invoking input...");
			java.lang.String _input_in = "Input value!";
			java.lang.String _input__return = port.input(_input_in);
			System.out.println("input.result=" + _input__return);
		}

		System.exit(0);
	}

}



客户端代码是根据CXF生成的代码改的。

接下来是CallBackHandler
UTPasswordClientCallBack.java
package com.tongtech.ti.demo.security.ut.client;

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class UTPasswordClientCallBack implements CallbackHandler {

	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
		pc.setPassword("password");
		System.out.println("UserName=" + pc.getIdentifier());
		System.out.println("Password=" + pc.getPassword());
	}

}



下面是服务端代码:
Server.java
package com.tongtech.ti.demo.security.ut.server;

import java.util.HashMap;
import java.util.Map;

import javax.xml.ws.Endpoint;

import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.handler.WSHandlerConstants;

import com.tongtech.ti.demo.security.service.ISecuriyDemoImpl;

/**
 * This class was generated by Apache CXF 2.4.0-SNAPSHOT Fri Oct 22 15:44:43 CST
 * 2010 Generated source version: 2.4.0-SNAPSHOT
 * 
 */

public class Server {

	protected Server() throws Exception {
		System.out.println("Starting Server");
		Object implementor = new ISecuriyDemoImpl();
		String address = "http://localhost:8080/sec";
		EndpointImpl ep = (EndpointImpl) Endpoint.publish(address, implementor);
		org.apache.cxf.endpoint.Endpoint cxfEp = ep.getServer().getEndpoint();
		Map<String, Object> inProp = new HashMap<String, Object>();
		inProp
				.put(WSHandlerConstants.ACTION,
						WSHandlerConstants.USERNAME_TOKEN);
		inProp.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
		inProp.put(WSHandlerConstants.PW_CALLBACK_CLASS,
				UTPasswordServerCallBack.class.getName());
		cxfEp.getInInterceptors().add(new WSS4JInInterceptor(inProp));

	}

	public static void main(String args[]) throws Exception {
		new Server();
		System.out.println("Server ready...");

		Thread.sleep(60 * 60 * 1000);
		System.out.println("Server exiting");
		System.exit(0);
	}
}



接下来是服务端的CallBackHandler
UTPasswordServerCallBack.java
package com.tongtech.ti.demo.security.ut.server;

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class UTPasswordServerCallBack implements CallbackHandler {

	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
		System.out.println("UserName=" + pc.getIdentifier());
		System.out.println("Password=" + pc.getPassword());
	}

}



代码献上了,如何使用这些代码,下面简单说下:
先给出Maven的Pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>ti-cxf</groupId>
	<artifactId>ti-cxf-security</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>Tongtech Demo for CXF Security with wss4j</name>
	<properties>
		<cxf.version>2.4.0-SNAPSHOT</cxf.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-ws-security</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http-jetty</artifactId>
			<version>${cxf.version}</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.cxf</groupId>
				<artifactId>cxf-codegen-plugin</artifactId>
				<version>${cxf.version}</version>
				<executions>
					<execution>
						<id>generate-sources-static</id>
						<phase>generate-sources</phase>
						<configuration>
							<sourceRoot>${basedir}/target/generate</sourceRoot>
							<wsdlOptions>
								<wsdlOption>
									<wsdl>${basedir}/src/main/java/com/tongtech/ti/demo/security/security.wsdl</wsdl>
									<extraargs>
										<extraarg>-db</extraarg>
										<extraarg>jaxb</extraarg>
										<extraarg>-p</extraarg>
										<extraarg>com.tongtech.ti.demo.security.service</extraarg>
										<extraarg>-all</extraarg>
									</extraargs>
								</wsdlOption>
							</wsdlOptions>
						</configuration>
						<goals>
							<goal>wsdl2java</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>


用maven先创建一个空的工程,如何创建,自己上上搜搜吧,主要是用maven的目录结构。
然后将上面的pom文件内容覆盖到创建好的pom文件中。

然后将wsdl文件复制保存到/src/main/java/com/tongtech/ti/demo/security/security.wsdl

然后命令行运行
mvn eclipse:eclipse或者mvn eclipse:myeclipse或者mvn idea:idea
然后maven会帮助你创建所需要的文件和类。

用eclipse或者idea打开工程,在创建好的目录下面创建com.tongtech.ti.demo.security.ut.client和com.tongtech.ti.demo.security.ut.server包,打开xxxx_xxxx_client.java文件,复制上面给的client.java文件,server同理,将client移动到client包下面,把server移动到server包下面,然后新建java类,起名叫UTPasswordClientCallBack.java和UTPasswordServerCallBack.java,将上面提到的两个callback代码,分别复制到这两个类中,然后运行服务器端和客户端查看效果。
1
1
分享到:
评论
2 楼 NoGrief 2010-10-26  
kimmking 写道
网上不少啊

不可否认是不少,大多都是同一个转来转去的。。
1 楼 kimmking 2010-10-25  
网上不少啊

相关推荐

    CXF 通过用户名和密码进行验证

    标题中的"CXF 通过用户名和密码进行验证"指的是在使用Apache CXF框架开发Web服务时,如何实现基于用户名和密码的身份验证。Apache CXF是一个开源的Java框架,它用于创建和消费SOAP和RESTful Web服务。这里的验证过程...

    cxf和springnvc整合

    首先,为了在 Spring 应用程序中使用 CXF,我们需要在项目的 `pom.xml` 文件中添加相应的 CXF 依赖。这些依赖包括 CXF 的核心组件、前端模块(如 JAX-WS 和 JAX-RS)、数据绑定模块以及传输模块。以下是一些常见的 ...

    使用cxf的webservice安全验证

    本篇将深入探讨如何使用Apache CXF进行Web服务的安全验证。 首先,我们要了解Web服务安全的基本概念。Web服务安全通常涉及身份验证、授权、加密和消息完整性。Apache CXF支持多种安全模型,包括基本认证、digest...

    CXF 2.4 WebService 发布和调用的身份验证和获取示例代码

    2. 调用安全性: 使用简单的USERNAME_TOKEN 3. 服务程序中取得调用者身份 ------------------------- 接口 ------------------------- intf.TrialService ------------------------- 服务端 ----------------------...

    CXF实现SSL安全验证

    ### CXF实现SSL安全验证 在现代网络应用中,安全通信是至关重要的。Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF ...

    Cxf客户端及服务器端,实现客户端和服务器端的权限验证

    在本文中,我们将深入探讨如何在Apache CXF框架中实现客户端和服务器端的权限验证。Apache CXF是一个开源的Java框架,主要用于构建和开发服务导向架构(SOA)和服务级应用程序。它支持多种Web服务标准,包括SOAP、...

    CXF 使用实例集成

    这个集成实例主要展示了如何使用CXF来创建和消费Web服务,包括设置输入和输出拦截器、用户验证以及文件上传等功能。让我们深入探讨一下这些知识点。 1. **CXF 创建 Web Service** - **服务接口定义**:首先,我们...

    CXF使用EndpointImpl发布WebService加入拦截器

    这些示例可能展示了如何创建自定义拦截器,以及如何在`EndpointImpl`中应用这些拦截器,以便在Web服务交互中进行跟踪、验证或其他自定义操作。 通过这种方式,我们可以利用CXF的拦截器机制增强Web服务的功能,提高...

    cxf 安全验证例子

    3. **证书认证**:在客户端和服务端之间使用SSL/TLS协议进行身份验证,通过交换数字证书来确认对方的身份。 4. **WS-Security**:支持诸如WS-Trust、WS-SecureConversation等规范,可以实现更复杂的身份验证和会话...

    CXF 调用ASP服务器端通过用户名密码验证

    java CXF客户端请求ERP SAP webservice通过用户名和密码验证功能!

    cxf使用中编码问题

    2. **XML文档编码**:CXF作为基于SOAP的服务,很多交互都是通过XML进行的。XML文件头通常会声明其编码,如`&lt;?xml version="1.0" encoding="UTF-8"?&gt;`。如果声明的编码与实际编码不符,解析时也会出错。 3. **数据库...

    Springboot整合CXF发布Web service和客户端调用(用户和密码验证)

    // 调用userService进行用户验证,返回UserDetails对象 } }; } } ``` 现在,我们的服务端已经准备就绪。要创建客户端调用这个Web服务,我们需要生成客户端代理类。CXF提供了`wsdl2java`工具,可以基于Web服务的...

    验证客户端源码cxf

    以上就是“验证客户端源码CXF”所涉及的主要技术点,理解这些概念有助于深入分析和使用提供的源码。由于没有具体的源码内容,以上解释是基于CXF框架一般使用的常规步骤和实践。如果你需要更具体的代码示例或更详细的...

    CXF使用手册

    CXF使用手册详细介绍了Java环境下的WebService支持,重点讲解了如何利用Apache CXF技术实现WebService。CXF是合并了Objectweb Celtix和Codehaus XFire之后的产品,它为Java开发者提供了一种构建和开发WebService的...

    使用CXF和camel-cxf调用webservice

    本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个全面的服务开发框架,它支持多种Web服务标准,如SOAP、WS-*协议栈、RESTful服务等。CXF提供了丰富的...

    cxf2.4.1+spring3.0+身份验证 webservice

    因为前一个资源,忘记删除个人的资料了,现在重新传一个,供大家学习使用,互相交流,资源内容 为rar格式的 项目,cxf 为服务器端,cxfTest 为客户端,里边有很多调用方式,还有身份验证,使用时,搭配好 客户端和...

    WebService:Axis客户端调用需要身份验证的CXF服务

    3. **WS-Security配置**:如果CXF服务使用了WS-Security,如UsernameToken或X.509 Token,那么在Axis客户端端也需要相应配置。这可能涉及到创建和添加WSS4JInInterceptor和WSS4JOutInterceptor,以处理安全令牌。 4...

    cxf+spring使用经验

    【cxf+spring 使用经验】 Apache CXF 是一个开源的 Web 服务框架,它整合了 Celtix 和 XFire 两大项目的优势,提供了全面的 JAX-WS 支持,允许开发者通过 Code First 或 WSDL First 的方式来创建和消费 Web 服务。...

    cxf安全验证完整实例

    这是一个cxf安全验证的完整实例,直接可以部署到应用服务器中运行。

Global site tag (gtag.js) - Google Analytics