Spring Boot安全性测试

我无法在测试中正确配置安全性。 我的网络安全配置:

@Configuration @EnableWebMvcSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/api/**").hasRole("USER") .and() .httpBasic() ; } } 

我的测试class:

 @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration @ContextConfiguration(classes = {Application.class, AppConfig.class, WebMvcConfig.class, WebSecurityConfig.class}) @WebAppConfiguration public class TestControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setUp() { MockitoAnnotations.initMocks(this); this.mockMvc = webAppContextSetup(wac).dispatchOptions(true).build(); } @Test public void getTest() throws Exception { mockMvc .perform(get("/api/test")) .andExpect(status().isForbidden()) ; } } 

我得到404状态代码意味着没有执行安全层,因此在我的测试类中没有正确配置它。 我试图将类从@ContextConfiguration切换到@SpringApplicationConfiguration但没有成功。

对您的代码进行以下修改:

  @Autowired private FilterChainProxy filterChainProxy; @Before public void setUp() { MockitoAnnotations.initMocks(this); this.mockMvc = webAppContextSetup(wac).dispatchOptions(true).addFilters(filterChainProxy).build(); } 

正如Spring Security 4.0.4的参考资料所述:

为了将Spring Security与Spring MVC Test一起使用,有必要将Spring Security FilterChainProxy添加为Filter 。 还需要添加Spring Security的TestSecurityContextHolderPostProcessor以支持在带有Annotations的Spring MVC Test中作为用户运行。 这可以使用Spring Security的SecurityMockMvcConfigurers.springSecurity()来完成。

例:

 import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @WebAppConfiguration public class TestControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup() { mockMvc = MockMvcBuilders .webAppContextSetup(wac) .apply(springSecurity()) //will perform all of the initial setup to integrate Spring Security with Spring MVC Test .build(); }