一、服务端代码
接口类
@WebService public interface HelloWorld { public String sayHello(String param); }
实现类
@WebService public class HelloWorldImpl implements HelloWorld { @Override public String sayHello(String param) { System.out.println("====================>"+param); return param; } }
拦截器回调类
public class ServerPasswordCallback implements CallbackHandler { private Map<String, String> passwords = new HashMap<String, String>(); public ServerPasswordCallback() { passwords.put("admin", "admin"); passwords.put("test", "test"); } @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { System.out.println("server:callbacks.length-" + callbacks.length); for (int i = 0; i < callbacks.length; i++) { WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; System.out.println("============>username:"+pc.getIdentifier()); System.out.println("============>password:"+pc.getPassword()); if (!passwords.containsKey(pc.getIdentifier())) try { throw new WSSecurityException("user not match"); } catch (WSSecurityException e) { e.printStackTrace(); } String pass = passwords.get(pc.getIdentifier()); pc.setPassword(pass); } } }
服务端spring配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <bean id="logIn" class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> <bean id="saajIn" class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" /> <bean id="wss4jIn" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> <constructor-arg> <map> <entry key="action" value="UsernameToken" /> <entry key="passwordType" value="PasswordText" /> <entry key="passwordCallbackClass" value="ws.test.server.security.ServerPasswordCallback" /> </map> </constructor-arg> </bean> <jaxws:server id="helloWorld" serviceClass="ws.test.server.HelloWorld" address="/helloWorldRemote"> <jaxws:inInterceptors> <ref local="logIn"/> <ref local="saajIn"/> <ref local="wss4jIn"/> </jaxws:inInterceptors> <jaxws:outInterceptors> <ref local="logOut"/> </jaxws:outInterceptors> <jaxws:serviceBean> <!-- 要暴露的 bean 的引用 --> <bean class="ws.test.server.impl.HelloWorldImpl"></bean> </jaxws:serviceBean> </jaxws:server> </beans>
二、 客户端代码
客户端回调处理类
public class ClientPasswordCallback implements CallbackHandler { private Map<String, String> passwords = new HashMap<String, String>(); public ClientPasswordCallback() { passwords.put("admin", "admin"); passwords.put("test", "test"); } @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { System.out.println("client:callbacks.length-" + callbacks.length); for (int i = 0; i < callbacks.length; i++) { WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; int usage = pc.getUsage(); if (!passwords.containsKey(pc.getIdentifier())) try { throw new WSSecurityException("user not exists "); } catch (WSSecurityException e) { e.printStackTrace(); } String pass = passwords.get(pc.getIdentifier()); if (usage == WSPasswordCallback.USERNAME_TOKEN && pass != null) { System.out.println("client:pass" + pass); pc.setPassword(pass); return; } } } }
客户端调用代码
JaxWsProxyFactoryBean proxyFactoryBean = new JaxWsProxyFactoryBean(); proxyFactoryBean.setServiceClass(HelloWorld.class); proxyFactoryBean.setAddress("http://localhost:8085/web/services/wRemote"); proxyFactoryBean.getInInterceptors().add(new LoggingInInterceptor()); proxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); proxyFactoryBean.getOutInterceptors().add(new SAAJOutInterceptor()); Map<String,Object> param =new HashMap<String,Object>(); param.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); param.put(WSHandlerConstants.USER, "admin"); param.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); param.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientPasswordCallback.class.getName()); WSS4JOutInterceptor wss4jOutInterceptor = new WSS4JOutInterceptor(param); proxyFactoryBean.getOutInterceptors().add(wss4jOutInterceptor); HelloWorld hw = (HelloWorld)proxyFactoryBean.create(); System.out.println(hw.sayHello("aaaaa"));
或
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:client id="client" serviceClass="ws.test.server.HelloWorld" address="http://localhost:8080/ws-test-web/services/helloWorldRemote"> <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxws:inInterceptors> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> <bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor"></bean> <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> <constructor-arg> <map> <entry key="#{T(org.apache.ws.security.handler.WSHandlerConstants).ACTION}" value="#{T(org.apache.ws.security.handler.WSHandlerConstants).USERNAME_TOKEN}" /> <entry key="#{T(org.apache.ws.security.handler.WSHandlerConstants).USER}" value="admin" /> <entry key="#{T(org.apache.ws.security.handler.WSHandlerConstants).PASSWORD_TYPE}" value="#{T(org.apache.ws.security.WSConstants).PW_TEXT}" /> <entry key="#{T(org.apache.ws.security.handler.WSHandlerConstants).PW_CALLBACK_CLASS}" value="ws.test.server.security.ClientPasswordCallback" /> </map> </constructor-arg> </bean> </jaxws:outInterceptors> </jaxws:client> </beans>
相关推荐
在本文中,我们将深入探讨如何在Apache CXF框架中实现客户端和服务器端的权限验证。Apache CXF是一个开源的Java框架,主要用于构建和开发服务导向架构(SOA)和服务级应用程序。它支持多种Web服务标准,包括SOAP、...
【描述】提到的"给CXF加上了一把密码锁"意味着在CXF的Web服务中实现了身份验证和加密功能,这通常是通过配置WS-Security策略来实现的。WS-Security提供了多种安全特性,如数字签名、消息加密、用户名令牌、X.509证书...
总结,"CXF 通过用户名和密码进行验证"涉及到了Web服务安全的基本概念,包括WS-Security标准、CXF的安全配置以及最佳实践。理解并正确应用这些知识对于开发安全的Web服务至关重要。提供的压缩包文件"cxftestClient...
5. **角色基授权**:通过在SOAP消息中添加WS-政策或WS-SecurityPolicy声明,可以实现基于角色的访问控制。 6. **令牌认证**:如SAML令牌,可以实现单点登录(SSO)功能。 源码示例可能包括以下几个关键部分: - *...
本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...
本篇将深入探讨如何使用Apache CXF进行Web服务的安全验证。 首先,我们要了解Web服务安全的基本概念。Web服务安全通常涉及身份验证、授权、加密和消息完整性。Apache CXF支持多种安全模型,包括基本认证、digest...
工具方面,CXF提供了多种工具帮助开发者管理和调试服务,如CXF的WS-SecurityTest工具,可以模拟不同的安全场景,包括基本认证。此外,使用像Postman这样的HTTP客户端工具,也可以方便地测试带有基本认证的Web服务。 ...
综上所述,"cxf+ws-security-JAR"是针对Web服务安全调用的解决方案,通过Apache CXF和WS-Security标准,为Web服务提供了强大的安全保障,确保了敏感数据的传输安全和用户身份的有效验证。这个JAR包很可能包含了一些...
在CXF中,WS-Security(Web Services Security)是一种关键的安全机制,用于确保Web服务的安全通信。WSS4J(Web Services Security for Java)是Apache的开源库,它为Java应用程序提供了实施WS-Security标准的功能。...
本篇将详细探讨如何使用CXF实现单向SSL(Secure Sockets Layer)和双向SSL的安全访问。首先,我们需要理解SSL的基本概念。 SSL是一种网络安全协议,用于在客户端和服务器之间建立加密连接,确保数据传输的隐私和...
8. **cxf-rt-ws-security.jar**: 包含了WS-Security和其他安全相关的实现,用于Web服务的安全认证和加密。 9. **cxf-tools-common.jar** 和 **cxf-tools-wsdlto-core.jar** 等工具类库,用于生成服务端和客户端代码...
身份验证是确保只有授权用户或系统能够访问服务的关键步骤。在CXF服务中,可能需要基本HTTP认证、 Digest认证、WS-Security(如X.509证书或Kerberos)等形式的身份验证。 当Axis客户端需要调用一个需要身份验证的...
4. **WS-Security**:CXF提供了强大的安全特性,支持WS-Security标准,可以实现基于证书的身份验证、消息加密和签名等安全功能。 5. **拦截器和终结点**:CXF的拦截器机制允许你在服务调用的生命周期中插入自定义...
通过学习这个示例,开发者可以了解如何在实际项目中集成CXF的WS-Security功能,确保Web服务的安全通信,防止未经授权的访问,并满足企业级的安全要求。这不仅对理解CXF框架的深度功能有帮助,也是提升Web服务开发...
【标题】:“3.CXF安全访问之SIGN_ENC(二)” 在本文中,我们将深入探讨Apache CXF框架中实现的安全访问机制,特别是SIG_N_ENC,这是一个结合了签名(Signature)和加密(Encryption)的安全策略。CXF是一个开源的...
在Web服务中,安全认证是验证客户端请求的身份的过程,以确保只有授权的用户或系统可以访问服务。在CXF中,我们可以使用WS-Security(Web Services Security)标准来实现这一功能,它支持多种安全机制,如用户名令牌...
在代码中,我们会创建一个CXF的JAX-WS(Java API for XML Web Services)客户端,该客户端将与指定的WebService进行通信。我们需要设置服务端点地址,通常是WSDL文件中的服务URL,然后调用相应的服务方法来获取QQ...
- 创建一个服务接口,使用JAX-WS注解如`@WebService`来标记,定义服务的方法。 - 实现服务接口,并使用`@WebService(serviceName = "...")`标记实现类。 - 在SpringBoot主类中,使用`@EnableCxfRsServer`开启CXF...