java Sping Boot 安全集成测试

ercv8c1e  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(133)

我正在遵循我找到的Sping Boot 集成测试教程,它包含以下测试:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class EmployeeControllerIntegrationTest
{
    @LocalServerPort
    private int port;

    @Autowired
    private TestRestTemplate rest;

    @Test
    public void test_Get_200() throws Exception
    {
        ResponseEntity<?> response = this.rest.getForEntity("http://localhost:" + port + "/employee", List.class);
        assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
    }
}

但是,我启用了Spring Security,因此此测试返回401而不是200。
如果它是相关的,这里是我的主应用程序的安全配置:

@Configuration
public class SecurityConfig
{
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception
    {
        http
                .csrf().disable() // Do NOT do this in real life.
                .authorizeHttpRequests((authz) -> authz
                        .anyRequest().authenticated()
                )
                .httpBasic(withDefaults());
        return http.build();
    }
}

我没有任何特殊的测试配置文件。我使用的是H2内存数据库。
我尝试使用@WithMockUser或@WithAnonymousUser,但都不起作用(我仍然得到401)。我知道API本身可以工作,因为我已经手动测试过了。当手动登录并从http://localhost:8088/employee端点请求GET时,它工作得很好。因为某种原因,测试不起作用。
我错过了什么?
非常感谢您提前任何帮助!

7ajki6be

7ajki6be1#

ChatGPT来拯救并找到了解决方案。
事实证明,您必须在请求头中包含有效的用户名和密码,如下所示:

ResponseEntity<?> response = this.rest.withBasicAuth("RealUser", "RealPassword").getForEntity("http://localhost:" + port + "/employee", List.class);

我只是加了这个

withBasicAuth("RealUser", "RealPassword")

我的原始代码。
仅添加此内容后,测试顺利通过。

m3eecexj

m3eecexj2#

我建议您在测试类中添加一些注解:

@WebMvcTest(controllers = EmployeeController.class)
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc(addFilters = false)
public class EmployeeControllerIntegrationTest
{
@LocalServerPort
private int port;

@Autowired
private TestRestTemplate rest;

@Test
@WithMockUser(username="john", password="doe")
public void test_Get_200() throws Exception
{
    ResponseEntity<?> response = this.rest.getForEntity("http://localhost:" + port + "/employee", List.class);
    assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
}

}
我已经在@AutoConfigureMockMvc中将addFilters参数设置为false,在类级别添加了@WebMvcTest(controllers = EmployeeController.class),最后在方法级别添加了@WithMockUser注解,您提到您已经尝试过了。请将username和/或password替换为有效的(或角色,如果是这种情况)。
希望有帮助!

相关问题