
本文档旨在指导开发者如何在 Spring Boot 应用程序中测试 API Key 认证。我们将通过一个实际案例,展示如何调整现有的集成测试,以便在请求中包含正确的 API Key,从而成功通过认证并验证端点的功能。
在 Spring Boot 应用中,API Key 认证是一种常见的安全机制,用于保护特定的端点。当需要对使用了 API Key 认证的端点进行测试时,我们需要确保测试用例能够正确地提供 API Key。以下将介绍如何通过修改测试代码,在请求头中添加 API Key,从而使测试通过认证。
集成测试中添加 API Key
假设我们有一个 Spring Boot 应用,其中 /validate 端点需要 API Key 认证。 认证逻辑通过自定义的 AuthFilter 实现,该过滤器会检查请求头中是否包含名为 API_KEY 的 Header,并验证其值是否与预定义的值匹配。
以下是一个简单的配置类示例:
@Configuration
@EnableWebSecurity
@Order(1)
public class AuthConfiguration {
public static final String API_KEY_VALUE = "skrdgvsnelrkv";
public static final String API_KEY_HEADER = "API_KEY";
@Value(API_KEY_HEADER)
private String principalRequestHeader;
@Value(API_KEY_VALUE)
private String principalRequestValue;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
AuthFilter apiKeyFilter = new AuthFilter(principalRequestHeader);
apiKeyFilter.setAuthenticationManager(new AuthenticationManager() {
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String principal = (String) authentication.getPrincipal();
if (!principalRequestValue.equals(principal)) {
throw new BadCredentialsException(
"The API key was not found or not the expected value."
);
}
authentication.setAuthenticated(true);
return authentication;
}
});
http.antMatcher(Endpoints.VALIDATE)
.csrf()
.disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(apiKeyFilter)
.authorizeRequests()
.anyRequest()
.authenticated();
return http.build();
}
}在测试中,我们需要模拟客户端发送请求,并在请求头中包含正确的 API Key。这可以通过 MockMvc 来实现。
假设我们有以下测试用例:
@AutoConfigureTestEntityManager
@SpringBootTest
@ContextConfiguration(classes = { TestContext.class })
@TestPropertySource(properties = { "spring.main.allow-bean-definition-overriding=true" })
@AutoConfigureMockMvc
class ControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void callingValidateEndpointWithValidFileShouldReturnResponseWithStatusOk()
throws Exception {
MockMultipartFile file =
MockMultipathFileBuilder.buildFromFilePath(TestFiles.VALID_FILE);
mockMvc.perform(MockMvcRequestBuilders.multipart(Endpoints.VALIDATE).file(file))
.andExpect(status().isOk());
}
}由于缺少 API Key,该测试将会返回 403 Forbidden 错误。要解决这个问题,我们需要修改测试代码,在请求中添加 API Key Header。
修改后的测试代码如下所示:
@AutoConfigureTestEntityManager
@SpringBootTest
@ContextConfiguration(classes = { TestContext.class })
@TestPropertySource(properties = { "spring.main.allow-bean-definition-overriding=true" })
@AutoConfigureMockMvc
class ControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void callingValidateEndpointWithValidFileShouldReturnResponseWithStatusOk()
throws Exception {
MockMultipartFile file =
MockMultipathFileBuilder.buildFromFilePath(TestFiles.VALID_FILE);
mockMvc.perform(
MockMvcRequestBuilders.multipart(Endpoints.VALIDATE)
.file(file)
.header(AuthConfiguration.API_KEY_HEADER, AuthConfiguration.API_KEY_VALUE)
).andExpect(status().isOk());
}
}关键在于添加了 .header(AuthConfiguration.API_KEY_HEADER, AuthConfiguration.API_KEY_VALUE) 这部分代码。 它告诉 MockMvc 在请求头中添加 API_KEY Header,并将其值设置为 skrdgvsnelrkv。
注意事项
- 确保 AuthConfiguration.API_KEY_HEADER 和 AuthConfiguration.API_KEY_VALUE 的值与实际应用中的配置一致。
- 在实际项目中,API Key 应该以安全的方式存储和管理,避免硬编码在代码中。可以使用环境变量、配置文件或专门的密钥管理服务。
- 在编写测试用例时,应尽可能覆盖各种场景,例如:
- API Key 缺失
- API Key 值不正确
- API Key 值正确
总结
通过在集成测试中添加 API Key Header,我们可以有效地测试 Spring Boot 应用中的 API Key 认证机制。这有助于确保端点的安全性,并验证其功能是否正常。记住,安全性测试是软件开发过程中不可或缺的一部分,应该贯穿整个开发周期。










