2016-07-30 19 views
5

Tôi đang cố gắng để kiểm tra @WebMvcTest với các thiết lập bảo mật tuỳ chỉnh theo quy định tại SecurityConfig lớp:kiểm tra an ninh trong mùa xuân Boot 1.4

@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"); 
    } 
} 

class Test là:

@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"))); 
    } 
} 

thử nghiệm thất bại bởi vì họ đang sử dụng cài đặt bảo mật mặc định của Spring Boot.

Tôi có thể sửa lỗi này bằng cách sử dụng @SpringBootTest + @AutoConfigureMockMvc, nhưng sẽ rất thú vị khi thử nghiệm mà không cần chạy tất cả cấu hình tự động.

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

    @Autowired 
    private MockMvc mockMvc; 

    // tests 
} 

Có cách nào mà @WebMvcTest có thể sử dụng các thiết lập quy định tại SecurityConfig lớp học?

+0

chỉ cần thêm mục này vào "application.properties" (trong "src/main/resources"): security.user.password = mật khẩu (và chọn mật khẩu của riêng bạn) –

+1

Cảm ơn nhưng đừng sửa nó ... vẫn bằng cách sử dụng cài đặt bảo mật mặc định nhưng buộc phải đặt mật khẩu thành "mật khẩu". Tôi chỉ bảo vệ các URI "/ admin *" bằng vai trò "ADMIN", cấu hình bảo mật mặc định bảo vệ tất cả các URI bằng vai trò "USER". – dmunozfer

+0

Cảm ơn lời bình luận David. Tôi không biết về bảo mật mặc định bảo vệ tất cả các URI bằng 'USER'. – Snekse

Trả lời

7

WebMvcTest sẽ chỉ tải trình điều khiển của bạn và không có gì khác (đó là lý do chúng tôi gọi là cắt). Chúng tôi không thể tìm ra phần cấu hình nào bạn muốn và bạn không muốn sử dụng cấu hình nào. Nếu cấu hình bảo mật không nằm trong số @SpringBootApplication chính, bạn sẽ phải nhập cấu hình đó một cách rõ ràng. Nếu không, Spring Boot sẽ kích hoạt các thiết lập bảo mật mặc định.

Nếu bạn đang sử dụng một cái gì đó như OAuth, đó là một điều tốt mặc dù bởi vì bạn thực sự không muốn bắt đầu sử dụng nó cho một thử nghiệm giả. Điều gì xảy ra nếu bạn thêm @Import(SecurityConfig.class) vào bài kiểm tra của mình?

+1

FYI: cũng có một cuộc thảo luận liên quan trong bộ theo dõi vấn đề Spring Boot: https://github.com/spring-projects/spring-boot/issues/6514 –

Các vấn đề liên quan