web-dev-qa-db-fra.com

Tests d'intégration de Spring MVC avec Spring Security

J'essaie de tester ma page de connexion en utilisant mvc-test. Je travaillais plutôt bien avant d'ajouter la sécurité du printemps.

Mon code est:

 mockMvc.perform(
     post("j_spring_security_check")
                    .param(LOGIN_FORM_USERNAME_FIELD, testUsernameValue)
                    .param(LOGIN_FORM_PASSWORD_FIELD, testPasswordValue))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().attribute(LOGIN_PAGE_STATUS_VALUE, LOGIN_PAGE_STATUS_FALSE_INDICATOR));

La classe de test a des annotations correctes ajoutées:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })

Mon filtre est défini (dans web.xml):

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Lorsque j'essaie d'ajouter web.xml dans @ContextConfiguration, il échoue, lorsque je le supprime, j'obtiens une exception:

Java.lang.AssertionError: Status expected:<200> but was:<405>

Existe-t-il un moyen d'ajouter DelegatingProxyFilter pour tester le contexte avec la configuration définie dans mon security-context.xml pour le faire fonctionner? J'ai essayé quelques tutoriels avec l'injection de FilterProxyChain, mais cela ne fonctionne pas dans mon cas.

Quelqu'un peut-il m'aider avec ça? Merci d'avance

26
wojtek

[~ # ~] mise à jour [~ # ~] : Spring Security 4+ fournit prêt à l'emploi intégration avec MockMvc . Pour l'utiliser, assurez-vous d'utiliser apply(springSecurity()) comme indiqué ci-dessous:

import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class MockMvcSecurityTests {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void setup() {
        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }
    ...
}

Réponse originale

Je ne sais pas ce que vous entendez par "lorsque j'essaie d'ajouter web.xml dans @ContextConfiguration, cela échoue", cependant, vous pouvez utiliser Spring Test MVC pour valider Spring Security. Il y a un très bon exemple décrit dans le projet spring-test-mvc .

Le plan de base ressemblerait à ceci:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })
public class MyTests {

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
            .addFilters(this.springSecurityFilterChain).build();
    }
}

L'idée est que vous @Autowire le FilterChainProxy (ce que le DelegatingProxyFilter délègue) et demandez à MockMvc d'utiliser le FilterChainProxy.

[~ # ~] note [~ # ~] spring-test-mvc est intégré dans spring-test-3.2 + et un projet distinct pour Spring 3.1 .x, vous pouvez donc utiliser l'exemple de manière assez interchangeable (spring-test-mvc ne prend pas en charge @WebAppConfiguration et doit utiliser WebContextLoader à la place).

58
Rob Winch

Ajouter dans pom.xml

<repository>
    <id>spring-snaspho</id>
    <url>http://repo.springsource.org/libs-milestone/</url>
</repository>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.0.M1</version>
</dependency>

et utilisez org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors pour la demande d'autorisation. Voir l'exemple d'utilisation à https://github.com/rwinch/spring-security-test-blog ( https://jira.spring.io/browse/SEC-2592 )

2
GKislin