java - Spring REST Docs:如何替换参数

在我的单元测试中,我们发现

this.mockMvc
  .perform(post("/authenticate")
    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
    .param("username", "user@example.com")
    .param("password", "superSecretPassword"))
  .andExpect(status().isOk())
  .andDo(document("preprocessed-request",
    preprocessRequest(replacePattern(Pattern.compile("superSecretPassword"), "XXX"))));


cf. Spring REST Docs documentation

这将生成带有内容的build/generated-snippets/preprocessed-request/http-request.adoc

[source,http]
----
POST /authenticate HTTP/1.1
Content-Type: application/x-www-form-urlencoded

username=user%40example.com&password=superSecretPassword
----


但是我希望由于replacePattern()而使密码被屏蔽:

[source,http]
----
POST /authenticate HTTP/1.1
Content-Type: application/x-www-form-urlencoded

username=user%40example.com&password=XXX
----


我能做什么?

最佳答案

由于MockMvc处理请求参数的不幸副作用,模式替换无效。 replacePattern作用于内容(即请求的正文),但是MockMvc实际上不在正文中包含表单编码的参数。

Spring REST Docs足够聪明,可以在生成代码片段时进行处理,例如对于格式为URL编码的POST请求,它会查看参数以找出请求的正文。应用replacePattern时,不会应用这些相同的智能。

您仍然可以使用自己的OperationPreprocessor更改参数映射来屏蔽密码。例如:

private OperationPreprocessor maskPassword() {
    return new PasswordMaskingPreprocessor();
}

private static class PasswordMaskingPreprocessor implements OperationPreprocessor {

    @Override
    public OperationRequest preprocess(OperationRequest request) {
        Parameters parameters = new Parameters();
        parameters.putAll(request.getParameters());
        parameters.set("password", "XXX");
        return new OperationRequestFactory().create(request.getUri(),
                request.getMethod(), request.getContent(), request.getHeaders(),
                parameters, request.getParts());
    }

    @Override
    public OperationResponse preprocess(OperationResponse response) {
        return response;
    }

}


然后,您可以使用此新的预处理器代替replacePattern

this.mockMvc
  .perform(post("/authenticate")
    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
    .param("username", "user@example.com")
    .param("password", "superSecretPassword"))
  .andExpect(status().isOk())
  .andDo(document("preprocessed-request",
    preprocessRequest(maskPassword())));

本文翻译自 https://stackoverflow.com/questions/33281509/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java spring spring-mvc spring-restdocs


相关文章:

spring-mvc - 弹簧安全与某些东西的冲突(也许是Spring MVC)

java - 是否可以使用Spring或boot验证URI pathparam是否为空?

hibernate - 用Hibernate + Spring缓存 - 一些问题!

java - 在Spring Context中实例化的JsonIdentityInfo Resolver

java - GridBagLayout不起作用

java - Java中的WaitForMultipleObjects

spring - 在Spring + Tomcat上使用JSF 2.2.9导致java.lang.NoClassDefFoundError:javax / enterprise / context / spi / Contextual

java - Spring boot + jpa lazy fetch

java - Java:在最后一分钟实现Hit()和getNumHits()

java - 如何在java swt的组合(下拉)中添加复选框?