Spring Security 如何在Sping Boot 中模拟JwtDecoder以进行已认证控制器的集成测试?

bqf10yzr  于 2023-02-16  发布在  Spring
关注(0)|答案(1)|浏览(210)

在我的Spring Boot应用程序中,有一些经过认证的控制器,运行模式是"OAuth2资源服务器",所以我的应用程序依赖于某个任意的OAuth2授权服务器(假设它是Keycloak,尽管它应该不影响mock的方式)
所以,问题是:

    • 模拟JwtDecoder的正确方法是什么,以便能够传递一些静态字符串作为承载令牌?**

(请记住,它是负责令牌发布的第三方服务器;所以我不能在测试中依赖它。例如,我想模拟它,以便能够脱机运行测试)

  • 我希望发生的事情的一个例子:*

1.我模拟JwtDecoder(假设我创建了一些〈token string,UserData〉的Map)
1.我使用Authorization头中的这个静态字符串(Authorization:控制器测试用@SpringBootTest@AutoConfigureMockMvc修饰。
1.我希望用来自被模拟的JwtDecoderMap的UserData的数据填充JwtAuthenticationToken。

    • 我已经尝试**创建一个具有所有描述特性的JwtDecoder实现的bean。我看到这个bean被添加到配置中,但是整个测试仍然以AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext结束。所以我假设JwtDecoder从未被调用(用调试器检查),并且整个测试设置被错误配置,但是我不知道确切地改变什么。

我错过了什么?

mum43rcc

mum43rcc1#

对于MockMvc(以及React式应用程序中的WebTestClient),Authorization头被忽略(不解码、验证、内省或其他)。
测试安全上下文将直接设置(SecurityContextHolder.createEmptyContext().setAuthentication(auth);)或借助以下任一项进行设置:

  • 测试注解(如@WithMockUser,但这个注解不太适合模拟OAuth2身份)。
  • 请求MockMvc的后处理器
  • WebTestClients的增变子

更多详细信息,请参阅other answer

相关问题