网络当中搜索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代码,分别复制到这两个类中,然后运行服务器端和客户端查看效果。
分享到:
相关推荐
标题中的"CXF 通过用户名和密码进行验证"指的是在使用Apache CXF框架开发Web服务时,如何实现基于用户名和密码的身份验证。Apache CXF是一个开源的Java框架,它用于创建和消费SOAP和RESTful Web服务。这里的验证过程...
首先,为了在 Spring 应用程序中使用 CXF,我们需要在项目的 `pom.xml` 文件中添加相应的 CXF 依赖。这些依赖包括 CXF 的核心组件、前端模块(如 JAX-WS 和 JAX-RS)、数据绑定模块以及传输模块。以下是一些常见的 ...
本篇将深入探讨如何使用Apache CXF进行Web服务的安全验证。 首先,我们要了解Web服务安全的基本概念。Web服务安全通常涉及身份验证、授权、加密和消息完整性。Apache CXF支持多种安全模型,包括基本认证、digest...
2. 调用安全性: 使用简单的USERNAME_TOKEN 3. 服务程序中取得调用者身份 ------------------------- 接口 ------------------------- intf.TrialService ------------------------- 服务端 ----------------------...
### CXF实现SSL安全验证 在现代网络应用中,安全通信是至关重要的。Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF ...
在本文中,我们将深入探讨如何在Apache CXF框架中实现客户端和服务器端的权限验证。Apache CXF是一个开源的Java框架,主要用于构建和开发服务导向架构(SOA)和服务级应用程序。它支持多种Web服务标准,包括SOAP、...
这个集成实例主要展示了如何使用CXF来创建和消费Web服务,包括设置输入和输出拦截器、用户验证以及文件上传等功能。让我们深入探讨一下这些知识点。 1. **CXF 创建 Web Service** - **服务接口定义**:首先,我们...
3. **证书认证**:在客户端和服务端之间使用SSL/TLS协议进行身份验证,通过交换数字证书来确认对方的身份。 4. **WS-Security**:支持诸如WS-Trust、WS-SecureConversation等规范,可以实现更复杂的身份验证和会话...
这些示例可能展示了如何创建自定义拦截器,以及如何在`EndpointImpl`中应用这些拦截器,以便在Web服务交互中进行跟踪、验证或其他自定义操作。 通过这种方式,我们可以利用CXF的拦截器机制增强Web服务的功能,提高...
java CXF客户端请求ERP SAP webservice通过用户名和密码验证功能!
2. **XML文档编码**:CXF作为基于SOAP的服务,很多交互都是通过XML进行的。XML文件头通常会声明其编码,如`<?xml version="1.0" encoding="UTF-8"?>`。如果声明的编码与实际编码不符,解析时也会出错。 3. **数据库...
// 调用userService进行用户验证,返回UserDetails对象 } }; } } ``` 现在,我们的服务端已经准备就绪。要创建客户端调用这个Web服务,我们需要生成客户端代理类。CXF提供了`wsdl2java`工具,可以基于Web服务的...
以上就是“验证客户端源码CXF”所涉及的主要技术点,理解这些概念有助于深入分析和使用提供的源码。由于没有具体的源码内容,以上解释是基于CXF框架一般使用的常规步骤和实践。如果你需要更具体的代码示例或更详细的...
CXF使用手册详细介绍了Java环境下的WebService支持,重点讲解了如何利用Apache CXF技术实现WebService。CXF是合并了Objectweb Celtix和Codehaus XFire之后的产品,它为Java开发者提供了一种构建和开发WebService的...
本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个全面的服务开发框架,它支持多种Web服务标准,如SOAP、WS-*协议栈、RESTful服务等。CXF提供了丰富的...
因为前一个资源,忘记删除个人的资料了,现在重新传一个,供大家学习使用,互相交流,资源内容 为rar格式的 项目,cxf 为服务器端,cxfTest 为客户端,里边有很多调用方式,还有身份验证,使用时,搭配好 客户端和...
3. **WS-Security配置**:如果CXF服务使用了WS-Security,如UsernameToken或X.509 Token,那么在Axis客户端端也需要相应配置。这可能涉及到创建和添加WSS4JInInterceptor和WSS4JOutInterceptor,以处理安全令牌。 4...
【cxf+spring 使用经验】 Apache CXF 是一个开源的 Web 服务框架,它整合了 Celtix 和 XFire 两大项目的优势,提供了全面的 JAX-WS 支持,允许开发者通过 Code First 或 WSDL First 的方式来创建和消费 Web 服务。...
这是一个cxf安全验证的完整实例,直接可以部署到应用服务器中运行。