首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring安全性- oauth2资源服务器测试

Spring安全性- oauth2资源服务器测试
EN

Stack Overflow用户
提问于 2019-07-18 22:47:16
回答 1查看 3.2K关注 0票数 6

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

当我不发送csrf令牌时,我总是收到403状态码,即使在使用承载令牌时不需要令牌。

下面是我想测试的POST方法。

代码语言:javascript
复制
@PostMapping("/message")
public String createMessage(@RequestBody String message) {
    return String.format("Message was created. Content: %s", message);
}

以下是我的安全配置:

代码语言:javascript
复制
http.authorizeRequests(authorizeRequests -> authorizeRequests       
   .antMatchers("/message/**")
   .hasAuthority("SCOPE_message:read")
   .anyRequest().authenticated()
).oauth2ResourceServer(oauth2ResourceServer ->               
    oauth2ResourceServer
    .jwt(withDefaults())
);

我正在遵循弹簧-安全样本中提供的测试。

下面的测试应该通过,但失败了,因为在请求中没有发送csrf令牌。

代码语言:javascript
复制
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令牌添加到请求中时,测试通过:

代码语言:javascript
复制
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令牌。

我已经分叉了Security存储库,这个失败测试的项目可以在这个链接上使用。

是否有一种方法来配置我的测试,这样我就不需要在POST请求中发送csrf令牌了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-19 16:48:56

为了让CSRF过滤器检测到您正在使用JWT令牌,您需要将JWT令牌作为Authorization头或请求参数包含在您的请求中。

您提到的测试有一个模拟JwtDecoder,这意味着您可以使用任何字符串作为令牌,并模拟已解码的值。

然后你的测试将变成:

代码语言:javascript
复制
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,则需要检索有效的承载令牌并将其传递到Authorization头中。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57103518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档