Tomcat 使用Axis2和Rampart使用UsernameToken配置文件1.0保护Web服务

Tomcat 使用Axis2和Rampart使用UsernameToken配置文件1.0保护Web服务,tomcat,soap,axis2,rampart,usernametoken,Tomcat,Soap,Axis2,Rampart,Usernametoken,这是我关于堆栈溢出的第一个问题 我不是一个专业的java程序员,但我以前有使用该语言和不同IDE的经验 我有一个场景,客户要求从给定的WSDl创建一个必须使用UsernameToken Profile 1.0 OASIS Standard 200401对其进行身份验证的服务。它将通过生产服务器上的ssl进行保护 我一直在做一些研究,并试图实现不同的案例,我到了一个地步,没有什么是适合我的工作 我正在使用: Eclipse作为基本IDE Axis2 V1.6.3 Rampart V1.6.2 R

这是我关于堆栈溢出的第一个问题

我不是一个专业的java程序员,但我以前有使用该语言和不同IDE的经验

我有一个场景,客户要求从给定的WSDl创建一个必须使用UsernameToken Profile 1.0 OASIS Standard 200401对其进行身份验证的服务。它将通过生产服务器上的ssl进行保护

我一直在做一些研究,并试图实现不同的案例,我到了一个地步,没有什么是适合我的工作

我正在使用:

  • Eclipse作为基本IDE
  • Axis2 V1.6.3
  • Rampart V1.6.2
  • Rahasv1.6.2
为了说明当前的情况,这里我向您展示了eclipse在将WSDLEclipse作为基本IDE生成JavaBean服务结构时为我创建的结构


应用的配置:

在WebContent/WEB-INF/conf/axis2.xml中,我使rampart模块和passwordCallbackClass能够处理soap头中提供的用户名和密码

<module ref="rampart" />

<parameter name="InflowSecurity">
    <action>
        <items>UsernameToken</items>
        <passwordCallbackClass>
            serviceManager.ServiceAuthUserNameToken
        </passwordCallbackClass>
        <passwordType>PasswordText</passwordType>
    </action>
</parameter>

...

下面的堆栈跟踪是:

    org.apache.neethi.PolicyReference.getRemoteReferencedPolicy(PolicyReference.java:155)
org.apache.neethi.PolicyReference.normalize(PolicyReference.java:110)
org.apache.axis2.util.PolicyUtil.getMergedPolicy(PolicyUtil.java:267)
org.apache.axis2.description.AxisBindingMessage.calculateEffectivePolicy(AxisBindingMessage.java:294)
org.apache.axis2.description.AxisBindingMessage.getEffectivePolicy(AxisBindingMessage.java:225)
org.apache.axis2.context.MessageContext.getEffectivePolicy(MessageContext.java:1617)
org.apache.rampart.RampartMessageData.&lt;init&gt;(RampartMessageData.java:233)
org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61)
org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:65)
org.apache.axis2.engine.Phase.invokeHandler(Phase.java:340)
org.apache.axis2.engine.Phase.invoke(Phase.java:313)
org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:262)
org.apache.axis2.engine.AxisEngine.sendFault(AxisEngine.java:516)
org.apache.axis2.transport.http.AxisServlet.handleFault(AxisServlet.java:433)
org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:216)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我检查了所有的东西和所有的方法,试图让它接受soap消息,但是我不能让它工作


感谢您的支持和关注

此问题的解决方案是,提供的WSDL遗漏了一些部分,无法根据UsernameToken概要文件1.0 OASIS标准200401进行自动验证

在IBM关于WS-Security的Metro中找到了解决方案

在WSDL文档中,绑定标记下有一个策略引用:

<wsp:PolicyReference URI="#UsernameTokenPolicy" wsdl:required="true"/>

完成所有这些之后,您必须能够在服务器端的Java web服务下自动验证与UsernameToken配置文件1.0 OASIS标准200401匹配的SOAP消息。

此问题的解决方案是,提供的WSDL遗漏了一些部分,以便能够自动验证UsernameToken配置文件1.0 OASIS标准200401下的消息

在IBM关于WS-Security的Metro中找到了解决方案

在WSDL文档中,绑定标记下有一个策略引用:

<wsp:PolicyReference URI="#UsernameTokenPolicy" wsdl:required="true"/>

完成所有这些之后,您必须能够在服务器端的Java web服务下自动验证与UsernameToken配置文件1.0 OASIS Standard 200401匹配的SOAP消息。

好的,最后找到问题的解决方案。最初的WSDL格式不正确,缺少了项目能够正常工作的一些重要部分。好了,终于找到了问题的解决方案。原始WSDL的格式不正确,缺少了项目能够正常工作的一些基本部分。
    org.apache.neethi.PolicyReference.getRemoteReferencedPolicy(PolicyReference.java:155)
org.apache.neethi.PolicyReference.normalize(PolicyReference.java:110)
org.apache.axis2.util.PolicyUtil.getMergedPolicy(PolicyUtil.java:267)
org.apache.axis2.description.AxisBindingMessage.calculateEffectivePolicy(AxisBindingMessage.java:294)
org.apache.axis2.description.AxisBindingMessage.getEffectivePolicy(AxisBindingMessage.java:225)
org.apache.axis2.context.MessageContext.getEffectivePolicy(MessageContext.java:1617)
org.apache.rampart.RampartMessageData.&lt;init&gt;(RampartMessageData.java:233)
org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61)
org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:65)
org.apache.axis2.engine.Phase.invokeHandler(Phase.java:340)
org.apache.axis2.engine.Phase.invoke(Phase.java:313)
org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:262)
org.apache.axis2.engine.AxisEngine.sendFault(AxisEngine.java:516)
org.apache.axis2.transport.http.AxisServlet.handleFault(AxisServlet.java:433)
org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:216)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
<wsp:PolicyReference URI="#UsernameTokenPolicy" wsdl:required="true"/>
<wsp:Policy wsu:Id="UsernameTokenPolicy" xmlns:wsp="http://www.w3.org/ns/ws-policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<sp:SupportingTokens
    xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
    <wsp:Policy>
        <sp:UsernameToken
            sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
            <wsp:Policy>
                <sp:WssUsernameToken11 />
            </wsp:Policy>
        </sp:UsernameToken>
    </wsp:Policy>
</sp:SupportingTokens>
<wsss:ValidatorConfiguration wspp:visibility="private"
      xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"
      xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy">
    <wsss:Validator name="usernameValidator" classname="[packageName].[callBackValidatorName]"/>
    </wsss:ValidatorConfiguration>
</wsp:Policy>
package [packageName];


import com.sun.xml.wss.impl.callback.PasswordValidationCallback;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;

public class [callBackValidatorName] implements PasswordValidationCallback.PasswordValidator{

@Override
public boolean validate(PasswordValidationCallback.Request request) throws PasswordValidationCallback.PasswordValidationException {

    PasswordValidationCallback.PlainTextPasswordRequest ptreq;

    ptreq = (PasswordValidationCallback.PlainTextPasswordRequest) request;

    return "[HARCODED_USERNAME]".equals(ptreq.getUsername()) &&
        "[HARCODED_PWD]".equals(ptreq.getPassword());
}
}