복붙노트

[SPRING] 스프링 부트 1.4의 보안 테스트

SPRING

스프링 부트 1.4의 보안 테스트

SecurityConfig 클래스에 정의 된 사용자 지정 보안 설정으로 @WebMvcTest를 테스트하려고합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/admin*").access("hasRole('ADMIN')").antMatchers("/**").permitAll().and().formLogin();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("ADMIN");
    }
}

테스트 클래스 :

@RunWith(SpringRunner.class)
@WebMvcTest(value = ExampleController.class)
public class ExampleControllerMockMVCTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void indexTest() throws Exception {
        mockMvc.perform(get("/"))
        .andExpect(status().isOk())
        .andExpect(view().name("index"));
    }

    @Test
    public void adminTestWithoutAuthentication() throws Exception {
        mockMvc.perform(get("/admin"))
        .andExpect(status().is3xxRedirection()); //login form redirect
    }

    @Test
    @WithMockUser(username="example", password="password", roles={"ANONYMOUS"})
    public void adminTestWithBadAuthentication() throws Exception {
        mockMvc.perform(get("/admin"))
        .andExpect(status().isForbidden());
    }

    @Test
    @WithMockUser(username="user", password="password", roles={"ADMIN"})
    public void adminTestWithAuthentication() throws Exception {
        mockMvc.perform(get("/admin"))
        .andExpect(status().isOk())
        .andExpect(view().name("admin"))
        .andExpect(model().attributeExists("name"))
        .andExpect(model().attribute("name", is("user")));
    }
}

Spring Boot의 기본 보안 설정을 사용하기 때문에 테스트가 실패합니다.

@SpringBootTest + @AutoConfigureMockMvc를 사용하여이 문제를 해결할 수 있지만 모든 자동 구성을 실행하지 않고 테스트하는 것은 흥미로울 것입니다.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class ExampleControllerSpringBootTest {

    @Autowired
    private MockMvc mockMvc;

    // tests
}

@WebMvcTest가 SecurityConfig 클래스에 정의 된 설정을 사용할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.WebMvcTest는 컨트롤러 만로드 할 것이고 다른 것은로드하지 않을 것입니다. 원하는 구성 부분과 그렇지 않은 부분을 파악할 수 없습니다. 보안 설정이 기본 @SpringBootApplication에 없다면 명시 적으로 가져와야합니다. 그렇지 않으면 스프링 부트가 기본 보안 설정을 활성화합니다.

    WebMvcTest는 컨트롤러 만로드 할 것이고 다른 것은로드하지 않을 것입니다. 원하는 구성 부분과 그렇지 않은 부분을 파악할 수 없습니다. 보안 설정이 기본 @SpringBootApplication에 없다면 명시 적으로 가져와야합니다. 그렇지 않으면 스프링 부트가 기본 보안 설정을 활성화합니다.

    OAuth와 같은 것을 사용한다면 모의 테스트를 위해 사용하기를 원하지 않기 때문에 좋은 일입니다. @Import (SecurityConfig.class)를 테스트에 추가하면 어떻게됩니까?

  2. from https://stackoverflow.com/questions/38675020/testing-security-in-spring-boot-1-4 by cc-by-sa and MIT license