当前位置: 首页 > 知识库问答 >
问题:

SOAP-WS安全头验证

乐欣可
2023-03-14

我开发了一个使用SpringXSD有效载荷的网络服务。我需要用SOAPUI实现的SOAP请求头中的用户名和密码来验证请求头

我能够在请求中生成下面的标题

   <soapenv:Envelope xmlns:jaxb="http://jaxb.miws.sg.com/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
   <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis- 200401-wss-wssecurity-secext-1.0.xsd" 
   xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <wsse:UsernameToken wsu:Id="UsernameToken-C3092BFBAE5B212E93144378035575013">
   <wsse:Username>User</wsse:Username>
   <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">test</wsse:Password>
   <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">CT1Fyo/g2WMaadE52bsnkg==           </wsse:Nonce>
   <wsu:Created>2015-10-02T10:05:55.750Z</wsu:Created>
   </wsse:UsernameToken>
   </wsse:Security>
   </soapenv:Header>

现在我想验证用户名和密码的标题元素。

Ex:

案例1: userName=User and Password=test//身份验证通过并给出响应成功

案例2:userName=User1和Password=test1//身份验证失败,并给出响应失败

请帮助我提供合适的样品来达到同样的目的。

共有2个答案

唐宇定
2023-03-14

以下是实现此目的的一些步骤:

  1. 通过编写自定义handleMessage方法来实现一个SOAPHandler类。
  2. handleMessage方法中,计算上下文的MESSAGE_OUTBOUND_PROPERTY。如果它是false(意味着它是一个入站消息),那么编写代码来反省context.getMessage()。在那里,您可以评估MIME标头,安全标头

SOAPHandler的示例:

public class MyCustomSoapHandler implements SOAPHandler<SOAPMessageContext>
{
  public Set<QName> getHeaders()
  {
    return Collections.emptySet();
  }

  public boolean handleMessage(SOAPMessageContext messageContext)
  {
     Boolean outboundProperty = (Boolean)
         messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);

     if (outboundProperty.booleanValue()) {
         //This is for handling messages going out of the conduit
     } else {
         //Here is where you want to authenticate
     }

     return true; //return false if do not want to proceed to the next handler in the chain
  }

  public boolean handleFault(SOAPMessageContext messageContext)
  {
    return true;
  }
   public void close(MessageContext messageContext)
  {
}

这里有一个SOAPHandler的入门模板,您需要将它添加到服务的处理链中:

@WebService(name = "Handler", targetNamespace = "http://example.org")
@HandlerChain(file="handler-chain.xml")
public class HandlerWS
{
  @Resource
  WebServiceContext ctx;
  @WebMethod()
  public String getProperty(String propertyName)
  {
    return (String) ctx.getMessageContext().get(propertyName);
  }
}

您还需要将handler-chain.xml添加到类路径:

examples.webservices.handler.处理examples.webservices.handler.处理

有关完整的指南,请参阅Oracle的创建SOAPHandler

楚彦
2023-03-14

SOAP网络服务中的处理程序(类似于拦截器/过滤器)可以用于服务器端的身份验证目的,然后进一步链接请求。请查看SOAPHandler,以解析有效负载中的头信息并验证用户名/密码。服务器端的SOAP处理程序

 类似资料:
  • 问题内容: 我正在尝试创建一个独立的客户端来使用某些Web服务。我必须将我的用户名和密码添加到SOAP Header。我尝试添加凭据,如下所示: 当我在服务上调用方法时,出现以下异常: 我究竟做错了什么?如何将这些属性添加到SOAP Header? 编辑:我正在使用JDK6中包含的JAX-WS 2.1。我现在正在使用JAX-WS 2.2。我现在得到以下异常: 如何创建此令牌? 问题答案: 不是10

  • 问题内容: 我有一个非常简单的方法,可以通过JAX-WS批注在WS API中使用: 现在我希望newParam是可选的。我的意思是我希望方法不仅在传递的xml中参数为空时仍然有效: 而且当它不存在时: 我需要它不破坏现有的API,该API在没有新参数的情况下也可以工作。 问题答案: @WebParam将消息部分映射到参数,并且部分不是可选的。请参阅WSDL中的可选消息部分。因此,简短的答案就是您要

  • 这是一个有点乏味的问题...我已经建立了一个WCF来使用WS-Security,在我的日志中看起来像这样: 问题是,为什么同一个名称空间会被引用两次(“http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd我知道,只要元素引用的是正确的名称空间,同一名称空间是否被引用两次其实并不重要,但我确

  • 问题内容: 我有一个已导入xsd的wsdl,此xsd具有类似如下的限制: 因此,我想细想一下,当我通过netbeans将这个耳朵部署到glassfish上时,将对传入的数据进行验证,但事实并非如此。在将数据传递给我的@WebService对象并转换为Java对象之前,是否需要进行任何调用以确保数据经过验证。 问题答案: 使用SchemaValidation批注。 请注意,它仅适用于文档/文字样式的

  • 问题内容: 目标 我正在为相当老的(但可悲的是不可更改)的接口实现Web服务。我有一个问题,正在调用我的服务的客户端期望SOAP响应中有某个命名空间,而我很难更改它以使其匹配。 考虑一个世界的例子,我想要这样: 看起来像这样: 我在这里找到了与尝试执行的操作类似的操作,但是在使相似的代码正确执行方面遇到困难。(我想坚持使用Metro,而不必更改为cxf或axis) 执行 我的实现返回如下所示: 该

  • 我正在尝试使用wsse:BinarySecurityToken(ValueType=)验证来自windows密钥库的CA证书http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3),但它通过一个异常失败:java.security.cert.CertPathValidatorExce