@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?的主要内容,如果未能解决你的问题,请参考以下文章