gpt4 book ai didi

json - 如何在 Spring Controller 单元测试中访问 CSRF token ?

转载 作者:行者123 更新时间:2023-12-04 16:48:18 24 4
gpt4 key购买 nike

我有一个 Spring Controller ,它根据来自“/user”的经过身份验证的 GET 返回以下 JSON:

{"name":<name>,"token":<csrf-token>}

我尝试为 Controller 构建单元测试,以验证返回的 JSON 是否包含动态生成的 CSRF token :

@Autowired
private FilterChainProxy springSecurityFilterChain;

private MockMvc mvc;

@Before
public void setUp()
throws Exception
{
...
mvc = standaloneSetup(controller)
.apply(springSecurity(springSecurityFilterChain))
.build();
}

@Test
public void getUser()
throws Exception
{
CsrfRequestPostProcessor csrfPostProcessor = null;
mvc.perform(get("/user").with(user(Const.USER)).with(csrfPostProcessor = csrf()))
.andExpect(status().isOk())
.andExpect(content().json("{\"name\":\"" + Const.NAME + "\",\"token\":\"" + csrfPostProcessor.toString() + "\"}"));
}

测试在这些方面失败了:

Failed tests: 
ControllerTest.getUser:74 token
Expected: org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors$CsrfRequestPostProcessor@203c20cf
got: 565a95b0-d0bb-4376-a8a0-725a3b16a787

有没有办法解决这个问题,如果没有,是否有办法构建一个使用动态生成的 CSRF token 的替代测试?

最佳答案

这是一个可能的解决方案——构造一个自定义匹配器来拦截 UUID4 格式的 CSRF token :

private static Pattern CSRF_PATTERN = Pattern.compile("[\\da-f]{8}-[\\da-f]{4}-4[\\da-f]{3}-[\\da-f]{4}-[\\da-f]{12}");

public static Matcher<String> isCsrf(StringBuilder intercept) {
return new ArgumentMatcher<String>() {
@Override
public boolean matches(Object obj) {
// intercept may be null
Assert.isTrue(obj instanceof DefaultCsrfToken, "obj");

String token = ((DefaultCsrfToken)obj).getToken();
if (intercept != null) {
intercept.setLength(0);
intercept.append(token);
}

java.util.regex.Matcher matcher = CSRF_PATTERN.matcher(token);
return matcher.matches();
}
};
}

然后按如下方式使用:

@Test
public void getUser()
throws Exception
{
StringBuilder token = new StringBuilder();
mvc.perform(get("/user").with(user(Const.USER)).with(csrf()))
.andExpect(status().isOk())
.andExpect(request().attribute("_csrf", isCsrf(csrf)))
.andExpect(content().json("{\"name\":\"" + Const.NAME + "\",\"token\":\"" + token.toString() + "\"}"));
}

作为奖励,您将获得一个 CSRF token 验证器。

关于json - 如何在 Spring Controller 单元测试中访问 CSRF token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com