当摘要认证开启时,Gatling 测试失败

Posted

技术标签:

【中文标题】当摘要认证开启时,Gatling 测试失败【英文标题】:Gatling test fails when digest authentication on 【发布时间】:2015-07-08 08:39:33 【问题描述】:

我最近开发了一个 SOAP Web 服务。 我开始在没有身份验证的情况下实现它。它运行良好:服务、带有 SOAP UI 的调用和 gatling 测试。

我添加了摘要式身份验证,现在我无法使我的 gatling 测试工作(使用 SOAP UI 的测试仍然成功)。 根据 gatling 文档 (here),我应该在我的 http 请求中调用 .digestAuth(login, pass)

val scn = scenario("scenario")
.feed(feeder)
.feed(feeder2)
.forever
  exec(
     http("myRequest")
     .post(target)
      .digestAuth("login","pass")
     .body(ELFileBody("Request.wsdl"))
     .headers(headers_2)
      )
 

来自服务器的答案始终是 500 错误消息:

2015 年 7 月 7 日下午 4:27:31 com.sun.xml.wss.impl.SecurityRecipient processMessagePolicy SCHWERWIEGEND:WSS0253:消息不符合配置的策略:在消息中找不到安全标头

更新:

我正在使用最新版本的 gatling 2.1.6

我无法共享我的网络服务,但这是它的配置方式。

spring-servlet.xml

<sws:interceptors>
    <bean id="wsSecurityInterceptor"
        class="org.springframework.ws.soap.security.xwss.XwsSecurityInterceptor">
        <property name="policyConfiguration" value="classpath:securityPolicy.xml" />
        <property name="callbackHandlers">
            <list>
                <ref bean="passwordValidationHandler" />
            </list>
        </property>
    </bean>
</sws:interceptors>

<bean id="passwordValidationHandler"
    class="org.springframework.ws.soap.security.xwss.callback.SimplePasswordValidationCallbackHandler">
    <property name="users">
        <props>
            <prop key="user">password</prop>
        </props>
    </property>
</bean>

还有securityPolicy.xml

<?xml version="1.0" encoding="UTF-8"?>
<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
  <xwss:RequireUsernameToken passwordDigestRequired="true" nonceRequired="true" />
</xwss:SecurityConfiguration>

更新 2: 以下是来自 gatling 日志的完整请求和响应:

10:06:57.243 [WARN ] i.g.h.a.AsyncHandlerActor - Request 'post_Addresscheck' failed:
status.find.in(200,304,201,202,203,204,205,206,207,208,209), but
actually found 500
10:06:57.244 [TRACE] i.g.h.a.AsyncHandlerActor - http://localhost:8000/ROOT/checkAddresshttp://localhost:8000/ROOT/checkAddress
headers=
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
Content-Length: 1830
Connection: keep-alive
Host: localhost:8000
Accept: */*
realm=Realmprincipal='user', password='password', scheme=DIGEST, realmName='', nonce='', algorithm='MD5', response='', qop='auth', nc='00000001', cno
nce='', uri='null', methodName='GET', useAbsoluteURI='true', omitQuery='false'
=========================
HTTP response:
status=
500 Internal Server Error
headers=
Server: [Apache-Coyote/1.1]
Accept: [text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2]
SOAPAction: [""]
Content-Type: [text/xml;charset=utf-8]
Content-Length: [605]
Date: [Thu, 09 Jul 2015 08:06:57 GMT]
Connection: [close]

我是否遗漏了测试定义中的某些内容?

【问题讨论】:

您使用的是哪个版本的加特林?你能分享一个复制器应用程序(你的带有摘要身份验证的网络服务)吗? 我在问题中的回答。感谢您的帮助 摘要式身份验证不能是抢先式的,与基本的相反。客户端必须首先发送一个普通请求,以便服务器可以回复 401 和随机数。只有这样,客户端才能发送经过身份验证的请求。见en.wikipedia.org/wiki/Digest_access_authentication。所以第一个简单的请求是预期的。完整的请求和响应是什么?你确定不能提供简单的样本吗? 【参考方案1】:

我认为这里可能存在混淆:Gatling 支持 HTTP 摘要身份验证,而不是 WSS 摘要身份验证(其中凭据作为 SOAP 标头在正文中传递,而不是 HTTP 标头)。

【讨论】:

以上是关于当摘要认证开启时,Gatling 测试失败的主要内容,如果未能解决你的问题,请参考以下文章

在空手道框架中实施摘要认证时面临问题;响应:缺少强制摘要值

Groovy 摘要认证

常用的加密算法--摘要认证和签名认证的实现

(chap8 确认访问用户身份的认证) DIGES认证(摘要认证)

摘要认证

详解摘要认证