本文介绍了如何在 spring Boot 应用中测试基于 API Key 的认证机制。通过在测试请求中添加正确的 API Key Header,可以模拟真实场景,确保 API Key 认证的正确性和有效性,从而保证接口的安全性和可靠性。
在 spring boot 应用中,API Key 认证是一种常见的安全机制,用于保护 API 接口免受未经授权的访问。为了确保 API Key 认证的正确性,我们需要编写相应的测试用例。本文将介绍如何使用 MockMvc 在 Spring Boot 测试中模拟 API Key 认证。
假设我们有一个 Spring Boot 应用,其中一个端点 /validate 需要通过 API Key 认证才能访问。认证逻辑通过自定义的 AuthFilter 实现,该过滤器会检查请求头中是否存在名为 API_KEY 的 Header,并验证其值是否与预定义的 API Key 值匹配。
以下是一个简单的 AuthConfiguration 示例:
@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 Header 的情况下,直接调用 /validate 端点会导致 403 Forbidden 错误。
为了解决这个问题,我们需要在测试请求中添加正确的 API Key Header。可以使用 MockMvcRequestBuilders 的 header() 方法来添加 Header。
以下是一个更新后的测试用例示例:
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @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) 方法将 API Key Header 添加到请求中。AuthConfiguration.API_KEY_HEADER 和 AuthConfiguration.API_KEY_VALUE 分别是 API Key Header 的名称和值,它们应该与 AuthConfiguration 类中定义的常量一致。
通过在测试请求中添加正确的 API Key Header,我们可以成功地模拟 API Key 认证,并确保 API 接口在受到保护的情况下能够正常工作。
总结
在 Spring Boot 应用中测试 API Key 认证的关键是在测试请求中添加正确的 API Key Header。通过使用 MockMvcRequestBuilders 的 header() 方法,我们可以轻松地添加 Header,并模拟真实场景,从而确保 API Key 认证的正确性和有效性。在编写测试用例时,请确保 API Key Header 的名称和值与配置类中的定义一致。