gpt4 book ai didi

java - 如何测试安全的 Spring Controller

转载 作者:行者123 更新时间:2023-11-30 05:18:50 25 4
gpt4 key购买 nike

我目前有一个使用 Spring Boot 2、Spring MVC、Spring Data/JPA 和 Thymeleaf 构建的应用程序。

我正在编写一些单元/集成测试,我想测试 Controller ,该 Controller 由 SpringSecurity 保护,并由注册用户的数据库支持。

测试它的最佳方法是什么?我尝试过其中一些方法,例如使用 @WithMockUser 等注释,但没有成功。

编辑:只是提醒一下,我没有测试 @RestController。我直接在我的测试类上注入(inject) @Controller 并调用其方法。没有 Spring Security 也能正常工作。

一个例子:

@Controller
public class SecuredController {
@GetMapping("/")
public String index() {
return "index";
}
}

/ 路径由 Spring Security 保护,通常会重定向到 /login 以对用户进行身份验证。

我的单元测试如下所示:

@WebMvcTest(controllers = SecuredController.class)
class SecuredControllerTest {

@Autowired
private SecuredController controller;

@Autowired
private MockMvc mockMvc;

@Test
@WithMockUser(username = "user", password = "pass", roles = {"USER"})
public void testAuthenticatedIndex() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andDo(print());
}
}

我得到的第一个错误是要求我注入(inject) UserDetailsS​​ervice 实现,这是我想避免的。但是,如果我确实注入(inject)服务,则测试可以正常工作,但返回 404 而不是 200。

有什么想法吗?

最佳答案

您需要通过导入 WebSecurityConfigurerAdapter 类将安全配置添加到 Spring 上下文。

@WebMvcTest(controllers = SecuredController.class)
@Import(SecuredControllerTest.Config.class)
class SecuredControllerTest {

@Configuration
@EnableWebSecurity
static class Config extends MyWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("pa$$").roles("USER");
auth.inMemoryAuthentication().withUser("admin").password("pa$$").roles("ADMIN");
}
}

...
}

嵌入的静态类Config只是为了改变我们从哪里获取用户,在这种情况下inMemoryAuthentication就足够了。

关于java - 如何测试安全的 Spring Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59875594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com