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

CXF 密码权限控制 SOAP报头处理

阅读更多

前一段时间写了一篇CXF密码验证_服务端和客户端配置

 

当时没有系统的讲解:

个人认为CXF认证方式很多.一种就像上一篇文章写的是直接对传送的数据包进行密码封装!

另一种就是现在要介绍的是另外一种.对SOAP头处理..把需要验证的密码封装在SOAP头里传送!

可能表达不是很清楚..看代码吧:

1:服务端spring里的配置:

  <bean id="Customer" class="org.web.HelloServiceImpl"></bean>
	<jaxws:endpoint  id="custom"  implementor="#Customer"   address="/web" >
	  	 <jaxws:inInterceptors>  
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />  
            <!--<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />  
            -->
            <bean class="org.web.soapHeader.ReadSoapHeader"></bean>
            <!--<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">  
                <constructor-arg>  
                    <map>  
                        <entry key="action" value="UsernameToken" />  
                        <entry key="passwordType"  
                            value="PasswordText" />  
                        <entry key="user" value="cxfServer" />  
                        <entry key="passwordCallbackRef">  
                            <ref bean="serverPasswordCallback" />  
                        </entry>  
                    </map>  
                </constructor-arg>  
            </bean> -->
            </jaxws:inInterceptors>  
	 </jaxws:endpoint>

这个里面是有注释的..区别上一个密码验证的示例!

关键代码就有一句: <bean class="org.web.soapHeader.ReadSoapHeader"></bean>

  这个是自己写的读取soap信息.查看密码是否正确!

2:soap读入信息的验证:ReadSoapHeader代码:

public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {
	private SAAJInInterceptor saa=new SAAJInInterceptor();
	public ReadSoapHeader(){
		super(Phase.PRE_PROTOCOL);
		getAfter().add(SAAJInInterceptor.class.getName());
	}
	public void handleMessage(SoapMessage message) throws Fault {
		SOAPMessage mess=message.getContent(SOAPMessage.class);
		if(mess==null){
			saa.handleMessage(message);
			mess=message.getContent(SOAPMessage.class);
		}
		SOAPHeader head=null;
		try {
			head = mess.getSOAPHeader();
		} catch (SOAPException e) {
			e.printStackTrace();
		}
		if(head==null){
			return;
		}
		NodeList nodes=head.getElementsByTagName("tns:spId");
		NodeList nodepass=head.getElementsByTagName("tns:spPassword");
		if(nodes.item(0).getTextContent().indexOf("wdw")!=-1){
			if(nodepass.item(0).getTextContent().equals("wdwsb")){
				System.out.println("认证成功");
			}
		}
		else{
			SOAPException soapExc=new SOAPException("认证错误");
			throw new Fault(soapExc);
		}
	}
}

  功能:判断客户端传来的soap信息头是否有密码..有的话判断是否正确!

 

3:客户端spring的配置:

 <bean id="webTest" class="org.web.HelloService" factory-bean="client" factory-method="create"/>
	 <bean id="client" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" >
	 		<property name="address" value="http://127.0.0.1:88/Hello/web/web"></property>
	 		<property name="serviceClass" value="org.web.HelloService"></property>
	 		<property name="outInterceptors">
	 			<list>
					<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />  
		            <!--<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />  -->
		            <bean class="org.web.soapHeader.AddSoapHeader"></bean>
		            <!--<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">  
		                <constructor-arg>  
		                    <map>  
		                        <entry key="action" value="UsernameToken" />  
		                        <entry key="passwordType"  value="PasswordText" />  
		                        <entry key="user" value="cxfClient" />  
		                        <entry key="passwordCallbackRef">  
		                            <ref bean="clientPasswordCallback" />  
		                        </entry>  
		                    </map>  
		                </constructor-arg>  
		            </bean>  
	 			-->
	 			</list>
		</property>
	 </bean>

  PS:注意注释>...重点是:

<bean class="org.web.soapHeader.AddSoapHeader"></bean>

 4:对soap进行如入头信息.把密码加进去:AddSoapHeader代码:

public class AddSoapHeader extends AbstractSoapInterceptor {
	private static String nameURI="http://127.0.0.1/Hello/web";
	
	public AddSoapHeader(){
		super(Phase.WRITE);
	}
	public void handleMessage(SoapMessage message) throws Fault {
		SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date=new Date();
		String time =sd.format(date);
		String spPassword="wdwsb";
		String spName="wdw";
		
		QName qname=new QName("RequestSOAPHeader");
		Document doc=DOMUtils.createDocument();
		
		Element spId=doc.createElement("tns:spId");
		spId.setTextContent(spName);
		
		Element spPass=doc.createElement("tns:spPassword");
		spPass.setTextContent(spPassword);
		
		Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader");
		root.appendChild(spId);
		root.appendChild(spPass);
		
		SoapHeader head=new SoapHeader(qname,root);
		List<Header> headers=message.getHeaders();
		headers.add(head);
	}
}

  很简单的东西...现在密码已经加进去了...spring里也已经配置好了..

客户端就可以正常的请求了..对请求的内容会进行soap头处理.把密码加进去....

服务端通过了客户端的权限密码请求就可以了.

 

东西很简单..不用过多的讲解了吧...

有什么疑问和见解..请提出来...大家共同学习!!

 

 

........

 

 

 

 

 

 

 

 

 

 

分享到:
评论
8 楼 dlut_chen 2011-05-24  
如果你的data有安全性要求,只用WS-SECURITY是无法满足的,SSL是比较简单安全的方法。我个人不建议走WS_*路线。
Web services的设计思想是无状态的,所以是没有session这个概念的,当然你可以自己实现security token 来代替 hashed password
Http Basic Auth+SSL从安全性看问题不大,但是不是一个好的设计模式对externel webservice,在WS-SECURITY中timestamp是用来做避免重访攻击的。
7 楼 opleo 2011-03-22  
我的应用场景如下:
接口地址:http://localhost:9763/services/UserWebService?wsdl
其wsdl文本片断如下:
<wsdl:service name="UserWebService"><wsdl:port name="UserWebServiceHttpsSoap11Endpoint" binding="ns:UserWebServiceSoap11Binding"><soap:address location="https://192.168.3.105:9443/services/UserWebService.UserWebServiceHttpsSoap11Endpoint/"/></wsdl:port><wsdl:port name="UserWebServiceHttpSoap11Endpoint" binding="ns:UserWebServiceSoap11Binding"><soap:address location="http://192.168.3.105:9763/services/UserWebService.UserWebServiceHttpSoap11Endpoint/"/></wsdl:port><wsdl:port name="UserWebServiceHttpsSoap12Endpoint" binding="ns:UserWebServiceSoap12Binding"><soap12:address location="https://192.168.3.105:9443/services/UserWebService.UserWebServiceHttpsSoap12Endpoint/"/></wsdl:port><wsdl:port name="UserWebServiceHttpSoap12Endpoint" binding="ns:UserWebServiceSoap12Binding"><soap12:address location="http://192.168.3.105:9763/services/UserWebService.UserWebServiceHttpSoap12Endpoint/"/></wsdl:port><wsdl:port name="UserWebServiceHttpEndpoint" binding="ns:UserWebServiceHttpBinding"><http:address location="http://192.168.3.105:9763/services/UserWebService.UserWebServiceHttpEndpoint/"/></wsdl:port><wsdl:port name="UserWebServiceHttpsEndpoint" binding="ns:UserWebServiceHttpBinding"><http:address location="https://192.168.3.105:9443/services/UserWebService.UserWebServiceHttpsEndpoint/"/></wsdl:port></wsdl:service>

现在我要访问https对应的端点,迁扯到证书方面的问题,请问下,我应怎么去做呢,
6 楼 plstryagain 2010-09-28  
<p>cxf 涉及安全方面主要有三个途径。<br><br>1. transport level的, https, 通过配置jetty来获得。cxf kit里面有一个例子wsdl_first_https, 很详细的讲了怎么使用https<br><br>2. soap message的,也就是通过WS-SECURITY协议对soap消息进行各种签名 加密 时间戳,传输密码(各种不同的Token)等操作,cxf中利用了Apache wss4j这个项目来实现WS-SECURITY, 楼主的例子就是UsernameToken的使用。<br>cxf kit里面ws_security有不少具体的例子,有兴趣可以看一下。<br><br>3.  最简单的方式是使用Http Basic Auth, 这个也是jaxws 规范里面要求必须实现的。<br><br>关于cxf security的相关讨论,在<a href="/forums/39/topics/680732/posts/cxf%20%E6%B6%89%E5%8F%8A%E5%AE%89%E5%85%A8%E6%96%B9%E9%9D%A2%E4%B8%BB%E8%A6%81%E6%9C%89%E4%B8%89%E4%B8%AA%E9%80%94%E5%BE%84%E3%80%82%20%201.%20transport%20level%E7%9A%84%EF%BC%8C%20https%EF%BC%8C%20%E9%80%9A%E8%BF%87%E9%85%8D%E7%BD%AEjetty%E6%9D%A5%E8%8E%B7%E5%BE%97%E3%80%82cxf%20kit%E9%87%8C%E9%9D%A2%E6%9C%89%E4%B8%80%E4%B8%AA%E4%BE%8B%E5%AD%90wsdl_first_https%EF%BC%8C%20%E5%BE%88%E8%AF%A6%E7%BB%86%E7%9A%84%E8%AE%B2%E4%BA%86%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8https%20%202.%20soap%20message%E7%9A%84%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E9%80%9A%E8%BF%87WS-SECURITY%E5%8D%8F%E8%AE%AE%E5%AF%B9soap%E6%B6%88%E6%81%AF%E8%BF%9B%E8%A1%8C%E5%90%84%E7%A7%8D%E7%AD%BE%E5%90%8D%20%E5%8A%A0%E5%AF%86%20%E6%97%B6%E9%97%B4%E6%88%B3%EF%BC%8C%E4%BC%A0%E8%BE%93%E5%AF%86%E7%A0%81(%E5%90%84%E7%A7%8D%E4%B8%8D%E5%90%8C%E7%9A%84Token)%E7%AD%89%E6%93%8D%E4%BD%9C%EF%BC%8Ccxf%E4%B8%AD%E5%88%A9%E7%94%A8%E4%BA%86Apache%20wss4j%E8%BF%99%E4%B8%AA%E9%A1%B9%E7%9B%AE%E6%9D%A5%E5%AE%9E%E7%8E%B0WS-SECURITY,%20%E6%A5%BC%E4%B8%BB%E7%9A%84%E4%BE%8B%E5%AD%90%E5%B0%B1%E6%98%AFUsernameToken%E7%9A%84%E4%BD%BF%E7%94%A8%E3%80%82%20cxf%20kit%E9%87%8C%E9%9D%A2ws_security%E6%9C%89%E4%B8%8D%E5%B0%91%E5%85%B7%E4%BD%93%E7%9A%84%E4%BE%8B%E5%AD%90%EF%BC%8C%E6%9C%89%E5%85%B4%E8%B6%A3%E5%8F%AF%E4%BB%A5%E7%9C%8B%E4%B8%80%E4%B8%8B%E3%80%82%20%203.%20%20%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E5%BC%8F%E6%98%AF%E4%BD%BF%E7%94%A8Http%20Basic%20Auth,%20%E8%BF%99%E4%B8%AA%E4%B9%9F%E6%98%AFjaxws%20%E8%A7%84%E8%8C%83%E9%87%8C%E9%9D%A2%E8%A6%81%E6%B1%82%E5%BF%85%E9%A1%BB%E5%AE%9E%E7%8E%B0%E7%9A%84%E3%80%82%20%20%E5%85%B3%E4%BA%8Ecxf%20security%E7%9A%84%E7%9B%B8%E5%85%B3%E8%AE%A8%E8%AE%BA%EF%BC%8C%E5%9C%A8cxf%20maillinglist%E9%87%8C%E9%9D%A2%E6%9C%89%E5%BE%88%E5%A4%9A%EF%BC%8C%E5%A4%A7%E5%AE%B6%E6%9C%89%E5%85%B4%E8%B6%A3%E5%8F%AF%E4%BB%A5%E5%8E%BB%E6%9F%A5%E7%9C%8B">cxf maillinglist</a>里面有很多,大家有兴趣可以去查看<br></p>
<p>Cxf网站上面的<a class="external-link" rel="nofollow" href="http://cxf.apache.org/docs/index.html">User's Guide</a>也对security有详细的讲解。</p>
<p>还有就是<a href="http://fusesource.com">FuseSource</a> 也有<a href="http://fusesource.com/documentation/fuse-service-framework-documentation/">Cxf的文档</a>, Fuse Services Framework就是基于<a href="http://cxf.apache.org">Apache Cxf.</a></p>
<p> </p>
<p>Freeman<br><br>------------------------<br><a href="http://fusesource.com">FuseSource</a>: http://fusesource.com<br><a href="http://servicemix.apache.org">Apache Servicemix</a>:http://servicemix.apache.org<br><a href="http://cxf.apache.org">Apache Cxf</a>: http://cxf.apache.org<br><a href="http://karaf.apache.org/">Apache Karaf</a>: http://karaf.apache.org<br><a href="http://felix.apache.org/">Apache Felix</a>: http://felix.apache.org<br></p>
5 楼 houlingling 2010-08-12  
服务端把jsessionid传递给客户端  客户端保存在cookie里
然后  客户端再把jsessionid以隐藏字段的形式传递给服务端
4 楼 xbcoil 2010-06-04  
wangchengyong 写道
session是有的,客户端每次请求服务端都生成session,返回jsessionid给客户端。
我就是不知道怎么保持客户端和服务端的session?




呵呵..继续研究...
3 楼 wangchengyong 2010-06-03  
session是有的,客户端每次请求服务端都生成session,返回jsessionid给客户端。
我就是不知道怎么保持客户端和服务端的session?
2 楼 xbcoil 2010-06-03  
ltian 写道
所有的SOAP访问都要这样处理吗?那么如何知道该身份的人是否有权限访问这个服务呢?
这里的访问一定没有Session的概念吧?




是的..没有session..这个问题暂时还没解决..

你有好的解决方法么?
1 楼 ltian 2010-06-02  
所有的SOAP访问都要这样处理吗?那么如何知道该身份的人是否有权限访问这个服务呢?
这里的访问一定没有Session的概念吧?

相关推荐

    CXF处理不规则SOAP message(转)

    标题中的"CXF处理不规则SOAP message(转)"指出,这篇内容主要涉及的是Apache CXF框架在处理非标准或不规范的SOAP(简单对象访问协议)消息时的问题和解决方案。SOAP是Web服务的一种通信协议,用于交换结构化的、...

    cxf.xml,cxf-servlet.xml,cxf-extension-soap.xml

    &lt;import resource="classpath:META-INF/cxf/cxf.xml"/&gt; &lt;import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/&gt; &lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml"/&gt;

    CXF打印SOAP报文,记录WebService日志

    1. **CXF Interceptors机制**:CXF采用了一种基于拦截器的架构,允许开发者在消息处理的不同阶段插入自定义的行为。这些拦截器可以被用来执行各种任务,比如安全检查、日志记录等。 2. **Logging Message**:CXF内部...

    CXF SOAP应用实例

    CXF提供了一套全面的工具和服务,包括代码生成器、WSDL到Java绑定、Java到WSDL绑定、SOAP消息处理和安全支持等。它的优势在于对WS-I兼容性、强大的错误处理和调试能力。 3. **创建SOAP服务** 使用CXF,我们可以从...

    CXF整合spring实现SOAP接口开发

    在IT行业中,CXF是一个广泛使用的开源框架,它支持服务导向架构(SOA)并通过SOAP协议提供Web服务。Spring框架则是Java应用开发的核心框架,它提供了丰富的功能来管理bean、处理事务、AOP(面向切面编程)等。将CXF...

    利用cxf和spring发布SOAP服务 整合所需jar包.

    4. cxf-rt-bindings-soap.jar:SOAP绑定组件,用于处理SOAP消息。 5. spring-context.jar:Spring的核心上下文库,包含IoC和AOP支持。 6. spring-web.jar:Spring的Web支持,用于在Web环境中集成Spring。 7. javax....

    用CXF开发SOAP接口

    【标题】"用CXF开发SOAP接口"涉及的是在Java环境中使用Apache CXF框架来创建、实现和消费基于SOAP(Simple Object Access Protocol)的Web服务。SOAP是一种用于交换结构化和类型化的信息的协议,常用于企业级应用...

    cxf-rt-bindings-soap-2.7.6.zip

    3. **消息处理**:CXF允许自定义SOAP消息的处理逻辑,包括编码、解码和异常处理。 4. **互操作性**:由于CXF对SOAP和WSDL的强大支持,它提高了与其他平台和语言的Web服务之间的互操作性。 此外,作为一个开源项目,...

    cxf-rt-bindings-soap-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-bindings-soap-3.0.1.jar; 赠送原API文档:cxf-rt-bindings-soap-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-bindings-soap-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-bindings-soap-...

    spring + cxf + restful + soap 集成小项目

    spring + cxf + restful + soap 方便初学者很快上手。 注解描述 @Path注解的值是一个相对的URI路径,这个路径指定了该Java类的位置,例如/helloworld。在这个URI中可以包含变量,例如可以获取用户的姓名然后作为参数...

    cxf-soap内容解析、更改(助记)

    标题 "cxf-soap内容解析、更改(助记)" 指向的是...但是,对于学习和实践CXF SOAP处理,可以参考官方文档、相关教程和已有的博客文章,如上述链接所示的博客,它们通常包含丰富的示例和实践经验,有助于深化理解。

    cxfdemo for both soap and restful style WS

    结合网上的例子,在本地搭建并且跑通了的基于CXF的例子,soap webservice 和 restful webservice的混搭模式. 依赖cxf 3.0.4 测试工具SOAPUI 5.0 服务器 tomcat 7 浏览器 chrome

    CXF soap例子源码

    CXF会自动处理与SOAP消息的交互。 3. **WSDL(Web Service Description Language)**:WSDL文件描述了服务的接口、消息格式、操作以及如何调用这些服务。CXF可以通过注解或XML配置文件自动生成WSDL。 4. **部署...

    CXF 添加soap 头部信息.zip_CXF增加soap头验证_bluex8z_cxf_meltedkw7_soap信息头

    安装完成后,可以使用SOAP UI等工具发送带有自定义SOAP头的请求,以测试CXF服务是否能够正确处理和验证头部信息。 综上所述,通过Apache CXF提供的Interceptor机制,我们可以方便地在SOAP消息中添加、读取和验证...

    在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口

    在提供的压缩包文件“cxf-ws-restful-spring-server”中,包含了使用CXF、SOAP和RESTful的示例项目。通过访问“http://localhost:8080/cxf-ws-restful-spring-server/ws63”,我们可以看到这些服务的实际运行效果。...

    CXF客户端添加soapHeader代码 + jar包 + apache-cxf-3.1.15

    以上步骤展示了如何在CXF客户端中添加SOAP Header,这个过程涉及到CXF客户端的配置、自定义Header处理以及服务调用。通过这样的方式,我们可以灵活地控制SOAP请求中的Header信息,满足各种服务交互的需求。记得根据...

    使用CXF实现带header的soap服务

    标题“使用CXF实现带header的soap服务”指的是在Java环境中,通过Apache CXF框架创建一个SOAP(简单对象访问协议)服务,同时处理带有HTTP头部信息的请求。Apache CXF是一个开源的服务框架,它允许开发者构建和消费...

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

    2. **角色和权限**:除了基本的用户名密码验证外,还可以结合角色和权限系统,为不同的用户提供不同级别的访问权限。 3. **证书认证**:除了用户名和密码,也可以使用X.509证书进行双向认证,提供更高级别的安全性...

    cxf-uw-ws-soap

    - CXF支持SOAP 1.1和1.2版本,提供了完整的SOAP处理能力,包括消息编码、处理WS-Security等。 - 使用CXF,开发者可以通过JAX-WS(Java API for XML Web Services)来创建SOAP服务。JAX-WS是Java中定义Web服务的...

Global site tag (gtag.js) - Google Analytics