@CurrentSecurityContext 总是在 mockMvc 集成测试中注入 null?

Posted

技术标签:

【中文标题】@CurrentSecurityContext 总是在 mockMvc 集成测试中注入 null?【英文标题】:@CurrentSecurityContext always inject null in mockMvc integration tests? 【发布时间】:2022-01-23 19:46:20 【问题描述】:

我正在使用 spring 安全注解 @CurrentSecurityContext 来注入身份验证对象。这在应用程序运行时效果很好,但在 @SpringBootTest 中它总是注入 null,即使在使用 @WithMockUser 时也是如此。

添加断点时,SpringSecurityContext中的Authentication对象正确填充了一个mock user principal,但是@CurrentSecurityContext解析器,即:CurrentSecurityContextArgumentResolver从不使用,它不会在任何断点处停止(构造函数,或解析器方法)在这堂课中。

我正在使用弹簧靴:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>

并使用mockMvc进行测试:

@Test
@WithMockUser
void activate_NotActivatedYet() 
  ....
  var result = mockMvc.perform(put(url).contentType(MediaType.APPLICATION_JSON)
        .content(content)
        .characterEncoding(CHAR_ENCODING))
    .andDo(print())
    .andDo(result -> flushIfNeeded())
    .andDo(result -> entityManager.clear());
 .....

还有我的休息端点:

@PutMapping("/code/activate")
public ResponseEntity<PromoCodeRestDto> activate(@CurrentSecurityContext Authentication authentication,
                                                 @PathVariable String code) 
    log.info("Requesting to activate the promo code with code []", code);

【问题讨论】:

【参考方案1】:

您的参数类型错误,您应该使用SecurityContext 而不是Authentication@CurrentSecurityContext 的 javadoc 说:

用于将 org.springframework.security.core.context.SecurityContext 解析为方法参数的注解。

否则,如果您只想要Authentication,则不需要任何注释来解决它。如果要认证的Principal,可以使用@AuthenticatedPrincipal注解。

【讨论】:

为什么会出错?它运行良好,只是在测试期间不行,为什么?

以上是关于@CurrentSecurityContext 总是在 mockMvc 集成测试中注入 null?的主要内容,如果未能解决你的问题,请参考以下文章

按人计算总花费时间和总成本

计算总销量和总销售额

一个类中计算了总页数,怎么在js中调用总页数

如何获取jasperReport报表总页数

如果代币的总余额超过了代币的总供应量,会发生啥?

jsp分页计算总页数公式