开发者社区 问答 正文

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:08:37 361 分享 版权
阿里云 AI 助理回答

在Spring Boot应用中,使用@WebMvcTest进行单元测试时,通常只加载与MVC相关的配置,如控制器、服务和一些模拟的Bean,而安全上下文(如OAuth2的认证信息)默认是不被加载的。因此,在执行测试时,你需要手动设置或模拟SecurityContext以便让测试中的请求能够携带认证信息。

要解决你的问题,你可以通过以下步骤来确保在@WebMvcTest中正确注入Authentication对象:

  1. 导入SecurityMockMvcConfigurer: 首先,确保你已经导入了必要的测试工具类,特别是那些可以帮助你配置Security上下文的类。这通常包括org.springframework.security.test.context.support.WithMockUser注解或者直接使用SecurityMockMvcRequestPostProcessors

  2. 使用SecurityMockMvcRequestPostProcessors: 在你的测试代码中,利用SecurityMockMvcRequestPostProcessors来添加认证信息到请求中。这个类提供了多种方法来模拟不同的认证场景,比如匿名用户、特定用户等。

修改你的测试代码如下:

import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors

mockMvc.perform(
    put("/api/...")
        .with(SecurityMockMvcRequestPostProcessors.authentication(anAuthentication)) // 这里用实际的认证信息替换anAuthentication
        .content("""...""")
        .contentType(MediaType.APPLICATION_JSON_UTF8)
)

这里的anAuthentication应该是一个代表已认证用户的Authentication对象。如果你只是想模拟一个简单的用户登录状态,可以使用withUser()方法简化操作:

mockMvc.perform(
    put("/api/...")
        .with(SecurityMockMvcRequestPostProcessors.user("username").password("password").roles("ROLE_USER"))
        .content("""...""")
        .contentType(MediaType.APPLICATION_JSON_UTF8)
)
  1. 如果需要自定义的Authentication细节,你可能需要创建一个具体的Authentication实例,并将其传递给.with()方法。这通常涉及到构造一个实现了Authentication接口的具体类,比如UsernamePasswordAuthenticationToken

  2. 考虑使用@SpringBootTest: 如果你发现仅通过@WebMvcTest难以完全模拟安全上下文,且你的测试确实需要完整的Spring环境(包括安全配置),可以考虑使用@SpringBootTest注解来启动整个应用上下文,同时结合@AutoConfigureMockMvc来专注于MVC层的测试。但请注意,这种方法会启动更多的组件,使得测试运行速度变慢。

通过上述方法,你应该能够在Web MVC测试中成功地通过并验证Authentication对象。

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