java - Spring security - oauth2 资源服务器测试

标签 java spring spring-boot spring-security spring-security-oauth2

我在使用@WebMvcTest 和 POST HTTP 方法测试 oauth2 资源服务器时遇到了一些问题。

当我不发送 csrf token 时,我总是收到 403 状态代码,即使在我使用不记名 token 时不需要该 token 。

这是我要测试的 POST 方法。

@PostMapping("/message")
public String createMessage(@RequestBody String message) {
    return String.format("Message was created. Content: %s", message);
}

这是我的安全配置:

http.authorizeRequests(authorizeRequests -> authorizeRequests       
   .antMatchers("/message/**")
   .hasAuthority("SCOPE_message:read")
   .anyRequest().authenticated()
).oauth2ResourceServer(oauth2ResourceServer ->               
    oauth2ResourceServer
    .jwt(withDefaults())
);

我正在按照 spring-security 的样本中提供的测试进行操作.

以下测试本应通过,但由于未在请求中发送 csrf token 而失败。

mockMvc.perform(post("/message").content("Hello message")
    .with(jwt(jwt -> jwt.claim("scope", "message:read")))
    .andExpect(status().isOk())
    .andExpect(content().string(is("Message was created. Content: Hello message")));

当我将 csrf token 添加到请求时,测试通过:

mockMvc.perform(post("/message").content("Hello message")
    .with(jwt(jwt -> jwt.claim("scope", "message:read")))
    .with(csrf()))
    .andExpect(status().isOk())
    .andExpect(content().string(is("Message was created. Content: Hello message")));

当我运行应用程序时,无需在 POST 请求中发送 csrf token 。

我已经 fork 了 Spring Security GitHub 存储库,这个测试失败的项目可以在这个 link 找到。 .

有没有办法让我配置我的测试,这样我就不需要在 POST 请求中发送 csrf token ?

最佳答案

为了让 CSRF 过滤器检测到您使用的是 JWT token ,您需要将 JWT token 作为 Authorization header 或请求参数包含在您的请求中。
您提到的测试有一个模拟 JwtDecoder,这意味着您可以使用任何字符串作为您的标记并模拟解码值。
你的测试将变成:

Jwt jwt = Jwt.withTokenValue("token")
        .header("alg", "none")
        .claim("scope", "message:read")
        .build();
when(jwtDecoder.decode(anyString())).thenReturn(jwt);
mockMvc.perform(post("/message")
        .content("Hello message")
        .header("Authorization", "Bearer " + jwt.getTokenValue()))
        .andExpect(status().isOk())
        .andExpect(content().string(is("Message was created. Content: Hello message")));

如果您没有模拟 JwtDecoder,那么您需要检索一个有效的承载 token 并将其传递到 Authorization header 中。

关于java - Spring security - oauth2 资源服务器测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57103518/

相关文章:

java - Hibernate 实体应该 Autowiring 还是 'manually' 实例化?

java - 可部署的 Spring Boot Wars OAuth2 拒绝异常

tomcat - 我可以为 Spring Boot 的嵌入式 tomcat 启用 tomcat 管理器应用程序吗?

Spring MVC 项目作为 jar

java - Android 兼容屏幕和密度

java apache poi(第 3 部分)

java - 如何安全地更改听众?

java - 从 JFrame GridBagLayout 获取组件大小

java - NetBeans 7.2,启动maven spring项目并添加hibernate

java - Spring引导+JUnit 5 : cannot globally set test instance lifecycle