我使用Java和WS-Security在我们的产品中公开了几个Web服务。我们的一位客户希望使用ColdFusion来使用Web服务。 ColdFusion是否支持WS-Security?我可以通过编写Java客户端并在ColdFusion中使用它来解决它吗?
(我对ColdFusion不太了解。)
答案 0 :(得分:5)
我假设您需要将安全性作为SOAP标头的一部分传递。以下是有关如何连接到.Net服务的示例。同样的方法应该适用于Java,只是url会有所不同。
<cfset local.soapHeader = xmlNew()>
<cfset local.soapHeader.TheSoapHeader = xmlElemNew(local.soapHeader, "http://someurl.com/", "TheSoapHeader")>
<cfset local.soapHeader.TheSoapHeader.UserName.XmlText = "foo">
<cfset local.soapHeader.TheSoapHeader.UserName.XmlAttributes["xsi:type"] = "xsd:string">
<cfset local.soapHeader.TheSoapHeader = xmlElemNew(local.soapHeader, "http://webserviceUrl.com/", "TheSoapHeader")>
<cfset local.soapHeader.TheSoapHeader.Password.XmlText = "bar">
<cfset local.soapHeader.TheSoapHeader.Password.XmlAttributes["xsi:type"] = "xsd:string">
<cfset theWebService = createObject("webservice","http://webserviceUrl.com/Webservice.asmx?WSDL")>
<cfset addSOAPRequestHeader(theWebService, "ignoredNameSpace", "ignoredName", local.soapHeader, false)>
<cfset aResponse = theWebService.SomeMethod(arg1)>
希望这就是你所需要的。
答案 1 :(得分:2)
生成'简单'的xml soap标头可能更准确。上面的例子缺少几行。
Local['soapHeader'] = xmlNew();
Local['soapHeader']['UsernameToken'] = xmlElemNew(local.soapHeader, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken");
Local['soapHeader']['UsernameToken']['username'] = xmlElemNew(local.soapHeader, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "username");
Local['soapHeader']['UsernameToken']['username'].XmlText = Arguments.szUserName;
Local['soapHeader']['UsernameToken']['username'].XmlAttributes["xsi:type"] = "xsd:string";
Local['soapHeader']['UsernameToken']['password'] = xmlElemNew(local.soapHeader, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "password");
Local['soapHeader']['UsernameToken']['password'].XmlText = Arguments.szPassword;
Local['soapHeader']['UsernameToken']['password'].XmlAttributes["xsi:type"] = "xsd:string";
addSOAPRequestHeader(ws, "ignoredNameSpace", "ignoredName", Local.soapHeader, false);
答案 2 :(得分:1)
我从未做过任何ws-security,也不知道ColdFusion是否可以使用它,而是回答你的第二个问题:
我可以通过编写一个java客户端并在coldfusion中使用它来解决它吗?
是的,绝对的。 ColdFusion可以轻松使用Java对象和方法。
答案 3 :(得分:1)
我正在研究WS-Secuirty和ColdFusion一段时间,可以肯定地说上面的例子不是WS-Security的实现。即使在标头中发送了用户名和密码,它们也会以纯文本格式发送。使用SSL会有所帮助,但WS-Security只需应用此代码即可完成更多工作。 ColdFusion本身不支持WS-Security,但它可以轻松使用Java对象和方法。 Apache提供了一个名为WSS4J的软件包,它提供了在Java中实现WS-Security的方法。您可以编写一个包装器,然后在ColdFusion中使用它。我已经能够这样做,但是,ColdFusion方面需要进行一些小的配置更改,我遇到了一些问题。
如果有人可以帮我解决配置问题,我真的很感激。
德米特里