开发者社区 问答 正文

spring如何在oauth2的测试中通过身份验证?

我已经设置了oauth2,并且正在生产中。在控制器的方法中:

fun setCars(@RequestBody carsData: CarsData, authentication: Authentication?) 该authentication参数被正确喷射。但是当我跑步@WebMvcTest去做

mockMvc.perform( put("/api/...") .with(authentication(anAuthentication)) .content("""...""") .contentType(MediaType.APPLICATION_JSON_UTF8) 然后,在控制器的方法中,该authentication参数为null。如何在Web MVC测试中通过身份验证对象?

展开
收起
被纵养的懒猫 2019-10-08 17:27:21 489 分享 版权
阿里云 AI 助理回答

在Spring Boot应用中,使用@WebMvcTest进行单元测试时,通常只加载与MVC相关的组件,如控制器、转换器、配置等,而安全上下文(如OAuth2的认证信息)默认是不被加载的。因此,你需要手动配置模拟的安全上下文来确保Authentication对象能正确注入。

你可以通过以下步骤设置:

  1. 导入SecurityMockMvcConfigurer类:首先确保你的测试类能够访问到Spring Security的测试支持。这通常意味着需要引入相应的依赖和静态导入相关方法。
import org.springframework.security.test.context.support.WithMockUser
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers
import org.springframework.test.web.servlet.setup.MockMvcBuilders
  1. 配置MockMvc以支持安全上下文:在构建MockMvc实例之前,使用SecurityMockMvcConfigurers.springSecurity()方法来配置它,以便它可以理解并处理与安全相关的注解和请求属性。
// 假设yourController是要测试的控制器
val mockMvc = MockMvcBuilders.standaloneSetup(yourController)
    .apply(SecurityMockMvcConfigurers.springSecurity())
    .build()
  1. 模拟Authentication对象:如果你希望特定的用户身份验证信息被注入,可以使用withUser系列方法来创建一个模拟的Authentication对象,并将其应用于测试请求。
mockMvc.perform(
    put("/api/...")
        .with(SecurityMockMvcRequestPostProcessors.user("username").password("password").roles("USER", "ADMIN"))
        .content("""...""")
        .contentType(MediaType.APPLICATION_JSON_UTF8)
)

或者,如果你已经有了一个自定义的Authentication实例(比如你提到的anAuthentication),可以直接使用它:

mockMvc.perform(
    put("/api/...")
        .with(SecurityMockMvcRequestPostProcessors.authentication(anAuthentication))
        .content("""...""")
        .contentType(MediaType.APPLICATION_JSON_UTF8)
)

这样,在执行测试请求时,你的控制器方法应该能够接收到正确的Authentication对象了。记得根据实际情况调整用户名、密码、角色等信息。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: