2016-07-30 20 views
5

Ich versuche @WebMvcTest mit benutzerdefinierten Sicherheitseinstellungen in SecurityConfig Klasse definiert zu testen:Sicherheitsprüfung im Frühjahr 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"); 
    } 
} 

Test-Klasse ist:

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

Tests scheitern, weil sie das verwenden Standard-Sicherheitseinstellungen von Spring Boot.

Ich kann dies beheben mit + @AutoConfigureMockMvc, aber es wäre interessant zu testen, ohne alle Auto-Konfiguration.

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

    @Autowired 
    private MockMvc mockMvc; 

    // tests 
} 

Gibt es eine Möglichkeit, dass @WebMvcTest in SecurityConfig Klasse definierten Einstellungen verwenden kann?

+0

Fügen Sie dies einfach zu "application.properties" (in "src/main/resources"): security.user.password = password (und wählen Sie Ihr eigenes Passwort) –

+1

Danke, aber reparieren Sie es nicht ... immer noch Verwenden der Standardsicherheitseinstellungen, aber Erzwingen des Kennworts auf "Kennwort". Ich sichere nur "/ admin *" URIs mit der Rolle "ADMIN", die Standardsicherheitskonfiguration schützt alle URIs mit der Rolle "USER". – dmunozfer

+0

Danke für den Kommentar David. Ich war mir der Standardsicherheit nicht bewusst, die alle URIs mit 'USER' schützt. – Snekse

Antwort

7

WebMvcTest wird nur Ihren Controller laden und nichts anderes (das ist, warum wir das Slicing nennen). Wir können nicht herausfinden, welcher Teil Ihrer Konfiguration Sie wollen und welchen nicht. Wenn die Sicherheitskonfiguration nicht auf Ihrer Haupt-@SpringBootApplication ist, müssen Sie sie explizit importieren. Andernfalls aktiviert Spring Boot die Standardsicherheitseinstellungen.

Wenn Sie etwas wie OAuth verwenden, ist das eine gute Sache, weil Sie wirklich nicht damit beginnen wollen, das für einen Scheintest zu verwenden. Was passiert, wenn Sie @Import(SecurityConfig.class) zu Ihrem Test hinzufügen?

+1

FYI: Es gibt auch eine verwandte Diskussion im Spring Boot Issue Tracker: https://github.com/spring-projects/spring-boot/issues/6514 –