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

在SOAP头请求中添加用于身份验证的元素

狄飞鹏
2023-03-14

我需要在我的新web服务中合并一个身份验证头(即作为SOAP头请求的一部分)。该身份验证头将验证用户ID和密码详细信息。我必须验证请求头详细信息的内容,以便在我的Web服务中进行身份验证。如果通过了身份验证,那么请求的SOAP主体将被处理,否则无效的身份验证消息将由Web服务发送回调用该服务的客户端应用程序。

我无法理解如何创建一个web服务,其中SOAP头将包含一些元素(在我的例子中是身份验证元素,如userId和password)。

通常,服务中公开的任何方法都将作为SOAP主体的一部分。因此混淆了如何继续在SOAP头中添加身份验证元素。

请帮帮忙

问候,

共有2个答案

东门新立
2023-03-14

我们只能从信封中获取报头,而不能从soap消息中获取报头。

唐炜
2023-03-14

最近,我编写了一个类,它将用户凭据添加到SOAP头中。为此,您需要创建一个实现SoapHandler 接口的类。例如:

public class MyHandler implements SOAPHandler<SOAPMessageContext> {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyHandler.class);

    private String username;

    private String password;

    /**
     * Handles SOAP message. If SOAP header does not already exist, then method will created new SOAP header. The
     * username and password is added to the header as the credentials to authenticate user. If no user credentials is
     * specified every call to web service will fail.
     *
     * @param context SOAP message context to get SOAP message from
     * @return true
     */
    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        try {
            SOAPMessage message = context.getMessage();
            SOAPHeader header = message.getSOAPHeader();
            SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
            if (header == null) {
                header = envelope.addHeader();
            }
            QName qNameUserCredentials = new QName("https://your.target.namespace/", "UserCredentials");
            SOAPHeaderElement userCredentials = header.addHeaderElement(qNameUserCredentials);

            QName qNameUsername = new QName("https://your.target.namespace/", "Username");
            SOAPHeaderElement username = header.addHeaderElement(qNameUsername );
            username.addTextNode(this.username);
            QName qNamePassword = new QName("https://your.target.namespace/", "Password");
            SOAPHeaderElement password = header.addHeaderElement(qNamePassword);
            password.addTextNode(this.password);

            userCredentials.addChildElement(username);
            userCredentials.addChildElement(password);

            message.saveChanges();
            //TODO: remove this writer when the testing is finished
            StringWriter writer = new StringWriter();
            message.writeTo(new StringOutputStream(writer));
            LOGGER.debug("SOAP message: \n" + writer.toString());
        } catch (SOAPException e) {
            LOGGER.error("Error occurred while adding credentials to SOAP header.", e);
        } catch (IOException e) {
            LOGGER.error("Error occurred while writing message to output stream.", e);
        }
        return true;
    }

    //TODO: remove this class after testing is finished
    private static class StringOutputStream extends OutputStream {

        private StringWriter writer;

        public StringOutputStream(StringWriter writer) {
            this.writer = writer;
        }

        @Override
        public void write(int b) throws IOException {
            writer.write(b);
        }
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        LOGGER.debug("handleFault has been invoked.");
        return true;
    }

    @Override
    public void close(MessageContext context) {
        LOGGER.debug("close has been invoked.");
    }

    @Override
    public Set<QName> getHeaders() {
        LOGGER.debug("getHeaders has been invoked.");
        return null;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

注意,我只是将凭据添加到头并返回true。您可以对整个消息执行您想执行的任何操作,如果预期的操作失败,则返回false

我已经实现了这个客户端:

<bean id="soapHandler" class="your.package.MyHandler">
    <property name="username" value="testUser"/>
    <property name="password" value="testPassword"/>
</bean>

<jaxws:client "...">
    <jaxws:handlers>
        <ref bean="soapHandler"/>
    </jaxws:handlers>
</jaxws:client>

但也可以在端点上实现。

 类似资料:
  • 本文向大家介绍在SAPUI5的AJAX请求中添加身份验证详细信息,包括了在SAPUI5的AJAX请求中添加身份验证详细信息的使用技巧和注意事项,需要的朋友参考一下 基本上,您需要利用JQuery AJAX的beforeSend函数来整理您的需求。 这是一个基本的代码片段- 您可以按照AddToHeader方法中的说明向标头添加更多详细信息。

  • 我使用Maven插件( 在target/generated source/wsdl2java/com中生成文件。公司。项目包括: Foo.java(java接口) foServiceLocator.java foSoapBindingImpl.java(java空实现) FoSoapBindingSkeleton.java FoSoapBindingStub.java 在我的项目中,我在一个同名的

  • 问题内容: 我想知道是否有一种方法让Dagger知道在有新数据可用时它应该重新创建对象。 我正在说的实例是我具有改造的请求标头。在某个时候(当用户登录时),我得到一个令牌,我需要将其添加到改造的标头中以发出经过身份验证的请求。问题是,我留下了相同的未经认证的改造版本。这是我的注入代码: 关于如何进行这项工作的任何想法? 问题答案: 请考虑使用 @oldergod* 提到的方法,因为它是 “官方的”

  • 一个客户端在我的SpringCloudGateway2上用它的证书点击了一条路由。我成功地使用x509身份验证对客户端进行了身份验证,然后,在将请求转发到下游服务之前,我想将主体名称添加到请求的cutom头中。 我已经创建了过滤器,但无法将主体名称放入标题值中。 下面是我的网关过滤器应用方法实现 问题是如何正确设置Headervalue,clientName.block()抛出异常...有什么建议

  • 我已经安装了OpenLDAP服务器。 如何在LDAP服务器中添加用户(条目)?以及如何打开该服务器的命令窗口,以便在其上运行ldap命令: :我的要求是:在我的应用程序中,我想对Openldap服务器中添加的用户进行身份验证,但我只能在windows os上安装Openldap服务器,但如何添加用户我无法获得方法。在Windows7操作系统上安装openLDAP whic时添加用户的方法是什么?这

  • 问题内容: 我正在尝试在python中使用基本身份验证 响应表单 auth 变量: 但是,当我尝试从其他位置获取数据时-我收到401错误 据我了解-在第二个请求中不是替换的会话参数。 问题答案: 您需要使用会话对象,并向 每个请求 发送身份验证。该会话还将为您跟踪Cookie:

  • 问题内容: 我有angularjs应用程序,用户在其中输入保存到数据库的数据,然后在服务器端将其编译为pdf文件。所有访问都需要适当的身份验证标头。填充所需的数据后,用户可以按按钮保存数据,然后检索pdf文件。理想情况下,我在我的angularjs应用中调用)。这可以正常工作并在另一个窗口中打开,但是如何向此请求添加身份验证标头?以我的理解,我无法下载pdf并使用ajax进行打印,因此我缺少此身份

  • 我试图得到一个API查询到python。命令行 给出一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python中调用它,这样我就可以循环使用不同的ID并分析输出。有什么想法吗?在需要身份验证之前,我已经使用urllib2完成了这项工作。我还查看了requests模块,但不知道如何实现。 非常感谢。