<!-- 服务端代码: -->
<jaxws:endpoint id="userWebService" implementor="#userServiceImpl"
address="/userservice">
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" >
<constructor-arg>
<map>
<entry key="action" value="UsernameToken Timestamp" />
<!-- MD5加密明文密码 -->
<entry key="passwordType" value="PasswordDigest" />
<entry key="user" value="admin" />
<entry key="passwordCallbackRef" >
<ref bean="serverPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:outInterceptors>
</jaxws:endpoint>
<bean id="serverPasswordCallback" class="com.cxf.webservice.callback.ServerPasswordCallback"></bean>
com.cxf.webservice.callback.ServerPasswordCallback:
package com.cxf.webservice.callback;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.log4j.Logger;
import org.apache.ws.security.WSPasswordCallback;
public class ServerPasswordCallback implements CallbackHandler {
Logger log = Logger.getLogger(ServerPasswordCallback.class);
Map<String, String> user = new HashMap<String, String>();
{
user.put("admin", "1234");
user.put("su", "1234");
}
@Override
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
log.debug("handler passwordcallback method....");
WSPasswordCallback wpc = (WSPasswordCallback) callbacks[0];
if (!user.containsKey(wpc.getIdentifier())) {
throw new SecurityException("No Permission!");
}
/*
* 此处特别注意::
* WSPasswordCallback 的passwordType属性和password 属性都为null,
* 你只能获得用户名(identifier),
* 一般这里的逻辑是使用这个用户名到数据库中查询其密码,
* 然后再设置到password 属性,WSS4J 会自动比较客户端传来的值和你设置的这个值。
* 你可能会问为什么这里CXF 不把客户端提交的密码传入让我们在ServerPasswordCallbackHandler 中比较呢?
* 这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5 的字符串,
* 如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,
* 由于MD5 算法参数不同结果也会有差别,另外,这样的工作CXF 替我们完成不是更简单吗?
*/
wpc.setPassword(user.get(wpc.getIdentifier()));//如果包含用户名,就设置该用户名正确密码,由CXF验证密码
String username = wpc.getIdentifier();
String password = wpc.getPassword();
log.debug("username: "+username + " password: "+password);
log.info("User : "+wpc.getIdentifier()+ " login!!!!!");
}
}
<!--客户端配置-->
<bean id="userService" class="webservice.cxf.client.UserService" factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="address" value="http://127.0.0.1:8080/HSQLDB/webservice/userservice"></property>
<property name="serviceClass" value="webservice.cxf.client.UserService"></property>
<property name="outInterceptors">
<list>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken Timestamp" />
<!-- MD5加密明文密码 -->
<entry key="passwordType" value="PasswordDigest" />
<entry key="user" value="admin" />
<entry key="passwordCallbackRef">
<ref bean="clientPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
</list>
</property>
</bean>
<bean id="clientPasswordCallback" class="webservice.cxf.clientPasswordCalback.ClientPasswordCallback"></bean>
webservice.cxf.clientPasswordCalback.ClientPasswordCallback:
package webservice.cxf.clientPasswordCalback;
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 ClientPasswordCallback implements CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (Callback callback : callbacks) {
//设置用户密码,供服务端验证
WSPasswordCallback wsc = (WSPasswordCallback)callback;
wsc.setIdentifier("su");
wsc.setPassword("1234");
}
}
}
Tset:
ApplicationContext app ;
@Before
public void initAPP(){
app = new ClassPathXmlApplicationContext("cxf-client.xml");
}
@Test
public void testSucruty(){
UserService us = (UserService) app.getBean("userService");
System.out.println(us.getAllUser().size());
}
分享到:
相关推荐
证书加密是WS-Security中的一个重要组成部分,它通常使用X.509数字证书来验证服务提供者和服务消费者的标识,并对消息进行加密。X.509证书包含公钥和私钥,公钥用于加密数据,私钥用于解密数据。在CXF中,我们可以...
CXF(CXF: Composite Application ...在实际应用中,根据业务需求选择合适的WS-Security策略,如使用数字签名确保消息完整性,使用加密保护敏感数据,以及通过各种令牌进行身份验证,可以有效提升Web服务的安全性。
也可以对消息进行加密,防止敏感数据在传输过程中被窃取。同时,WSS4J还支持多种安全令牌,如X.509证书、用户名令牌、SAML令牌等,以满足不同场景下的安全需求。 总之,WS-Security和WSS4J是Java环境中保障Web服务...
2. ws-security:这是OASIS制定的Web服务安全标准,用于在SOAP消息层面提供安全功能,如数字签名、加密、身份验证等。 3. webservice:Web服务是一种通过网络进行通信的应用程序接口,允许不同系统间的互操作性。 4....
在Java中,通常使用Apache CXF、Axis2等Web服务框架,它们内置了对WS-Security的支持。 使用"ws-security jar"时,开发者可以配置Web服务客户端和服务器端的策略,设置签名和加密算法,指定认证方式,以及处理证书...
WS-Security规范为Web服务的安全性提供了一个强大的框架,它不仅解决了传统安全机制的局限性,还通过消息完整性和加密等功能确保了SOAP消息的安全传递。此外,通过采用诸如时间戳、序列号和挑战-响应机制等策略,WS-...
ISNetworksProvider.jar可能是某个特定厂商提供的WS-Security实现或者一个特定的安全提供者,可能包含了对WS-Security规范的某些特定功能的支持,例如证书管理或特定加密算法的实现。 tsik.jar文件名暗示了它可能是...
数字签名基于非对称加密技术,发送方使用私钥对消息哈希进行签名,接收方使用公钥验证签名。 3. **消息保密性**:使用加密技术保护消息内容,防止在传输过程中被窃听。通常使用XML Encryption标准来实现。 4. **...
在SOAP消息中,`ws-security` 可以添加数字签名、加密、时间戳等元素,确保数据在传输过程中的安全。例如,`ws-security` 可以通过X.509证书进行公钥基础设施(PKI)的认证,也可以使用UsernameToken或 Kerberos ...
对于需要安全性的Web服务,如WS-Security,CXF提供了相应的jar包,如`cxf-rt-ws-security.jar`,包含了加密、签名、认证等安全功能。 6. **数据绑定和对象映射**: CXF支持多种数据绑定技术,如JAXB(Java ...
7. **安全机制**:CXF提供安全特性,包括基于证书的SSL/TLS加密、WS-Security标准实现,支持基本认证、digest认证、OAuth等。 在"apache-cxf-2.6.1-src"中,开发者可以找到以下文件和目录: - **cxf**: 这是CXF的...
CXF允许开发者创建和消费各种Web服务,支持多种协议和规范,如SOAP、RESTful HTTP、WS-*(如WS-Security)等。 CXF的主要特点和功能包括: 1. **服务实现与调用**:CXF提供了两种方式来实现Web服务,即JAX-WS...
8. **cxf-rt-ws-security.jar**: 包含了WS-Security和其他安全相关的实现,用于Web服务的安全认证和加密。 9. **cxf-tools-common.jar** 和 **cxf-tools-wsdlto-core.jar** 等工具类库,用于生成服务端和客户端代码...
7. **工具支持**:在实际开发中,许多开发工具和框架如Apache CXF、Spring WS等提供了WS-Security的支持,帮助开发者轻松实现SOAP消息的加密和签名。 8. **源码实践**:理解上述概念后,开发者需要编写代码来实现...
4. **安全特性**:CXF内置了对WS-Security(Web Services Security)的支持,包括消息认证、加密和数字签名等,确保Web服务的安全通信。 5. **工具集**:CXF提供了一套强大的工具,如wsdl2java用于从WSDL生成Java...
5. **WS-Security**:通过CXF,你可以实现Web服务的安全性,包括数字签名、加密和身份验证,符合WS-Security标准。 6. **Transport and Bindings**:CXF支持多种传输方式,如HTTP、HTTPS、JMS等,以及多种绑定机制...
例如,可以使用WS-Security来实现SOAP消息的加密和签名,确保通信安全。 7. **CXF与Spring集成** CXF可以很好地与Spring框架集成,通过Spring配置文件管理服务和客户端。这样可以方便地实现依赖注入,提高代码的可...
2. **强大的WS-*支持**:CXF不仅支持基本的SOAP通信,还支持一系列高级的Web服务标准,如WS-Security(用于身份验证和加密)、WS-Addressing(用于消息路由)等。 3. **多种绑定和传输机制**:除了传统的SOAP over ...
标题 "cxf-jar包.rar" 提供的是一组与Apache CXF相关的Java库,这是一套用于构建和开发Web服务的开源框架。这个压缩包包含的子文件都是...在CXF中,这个库用于实现XML消息的安全加密、签名等操作。 总结来说,这个"cx
7. **安全特性**:CXF支持WS-Security等安全标准,可以实现身份验证、消息加密和完整性校验,确保服务的安全性。 8. **测试工具**:CXF提供了测试工具,如CXF TestSuite,可以帮助开发者进行服务的单元测试和集成...