Spring Boot设置安全性以进行测试

use*_*219 7 java spring spring-mvc 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()
        ;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试班:

@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())
        ;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

geo*_*and 8

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

   @Autowired
   private FilterChainProxy filterChainProxy;


    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = webAppContextSetup(wac).dispatchOptions(true).addFilters(filterChainProxy).build();
    }
Run Code Online (Sandbox Code Playgroud)

  • 在spring-security 4.x中有一种新的方法:http://stackoverflow.com/questions/30536710/integration-tests-with-spring-security (2认同)

niv*_*ash 6

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

为了将Spring Security与Spring MVC Test一起使用,有必要将Spring Security添加FilterChainProxyFilter.还需要添加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();
    }
Run Code Online (Sandbox Code Playgroud)