SpringBoot @WebMvcTest 安全问题
SpringBoot @WebMvcTest security issue
我有一个 spring rest mvc 控制器,它有 url“/public/rest/vehicle/get”。在我的安全配置中,我定义了 /public/rest 的任何请求都不需要身份验证。
http.
csrf().disable()
.authorizeRequests()
.antMatchers("/home/**", "/**", "/css/**", "/js/**", "/fonts/**", "/images/**", "/public/rest/**","/login*","/signin/**","/signup/**").permitAll()
.antMatchers("/property/**").authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and().httpBasic().disable();
当我启动我的应用程序并使用浏览器或任何其他方式提交请求时,此配置工作正常。
现在,我有一个测试 class 看起来像这样,
@RunWith(SpringRunner.class)
@WebMvcTest(VehicleController.class)
public class VehicleControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private VehicleService vehicleService;
@Test
public void getVehicle() throws Exception {
given(this.vehicleService.get(0)).
willReturn(new VehicleEquipmentDTO());
this.mockMvc.perform(get("/public/rest/vehicle/get").param("id","0"))
.andDo(print())
.andExpect(status().isOk());//.andExpect(content().string("Honda Civic"));
}}
现在,当我 运行 这个测试时,它说
java.lang.AssertionError: Status
Expected :200
Actual :401
当我打印请求响应时,我发现它在抱怨安全问题。 "Error message = Full authentication is required to access this resource"
有什么想法为什么它不能使用我拥有的安全配置,以及强制它使用正确配置的解决方法是什么?提前致谢
终于找到原因了。由于WebMvcTest只是切片测试,所以不会进行安全配置。解决方法是像
一样显式导入它
@Import(WebSecurityConfig.class)
这解决了我同样的问题
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ClientResourceControllerTest {
我遇到了同样的问题,经过一段时间的搜索,我找到了以下解决方案。
因为,您在应用程序中启用了 Spring 安全性以及其他注释,您可以在 @AutoConfigureMockMvc
注释中指定 secure=false
参数,如下所示:
@AutoConfigureMockMvc(secure=false)
public class YourControllerTest {
//All your test methods here
}
说明:
要禁用 Spring 安全自动配置,我们可以使用 MockMvc
实例通过 @AutoConfigureMockMvc(secure=false)
禁用安全
我有一个 spring rest mvc 控制器,它有 url“/public/rest/vehicle/get”。在我的安全配置中,我定义了 /public/rest 的任何请求都不需要身份验证。
http.
csrf().disable()
.authorizeRequests()
.antMatchers("/home/**", "/**", "/css/**", "/js/**", "/fonts/**", "/images/**", "/public/rest/**","/login*","/signin/**","/signup/**").permitAll()
.antMatchers("/property/**").authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and().httpBasic().disable();
当我启动我的应用程序并使用浏览器或任何其他方式提交请求时,此配置工作正常。 现在,我有一个测试 class 看起来像这样,
@RunWith(SpringRunner.class)
@WebMvcTest(VehicleController.class)
public class VehicleControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private VehicleService vehicleService;
@Test
public void getVehicle() throws Exception {
given(this.vehicleService.get(0)).
willReturn(new VehicleEquipmentDTO());
this.mockMvc.perform(get("/public/rest/vehicle/get").param("id","0"))
.andDo(print())
.andExpect(status().isOk());//.andExpect(content().string("Honda Civic"));
}}
现在,当我 运行 这个测试时,它说
java.lang.AssertionError: Status
Expected :200
Actual :401
当我打印请求响应时,我发现它在抱怨安全问题。 "Error message = Full authentication is required to access this resource" 有什么想法为什么它不能使用我拥有的安全配置,以及强制它使用正确配置的解决方法是什么?提前致谢
终于找到原因了。由于WebMvcTest只是切片测试,所以不会进行安全配置。解决方法是像
一样显式导入它@Import(WebSecurityConfig.class)
这解决了我同样的问题
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ClientResourceControllerTest {
我遇到了同样的问题,经过一段时间的搜索,我找到了以下解决方案。
因为,您在应用程序中启用了 Spring 安全性以及其他注释,您可以在 @AutoConfigureMockMvc
注释中指定 secure=false
参数,如下所示:
@AutoConfigureMockMvc(secure=false)
public class YourControllerTest {
//All your test methods here
}
说明:
要禁用 Spring 安全自动配置,我们可以使用 MockMvc
实例通过 @AutoConfigureMockMvc(secure=false)