使用Spring Security Spring MVC的集成测试(Spring MVC integ

2019-07-18 20:23发布

我想使用MVC测试来测试我的登录页面。 我工作之前,我加入春季安全还不错。

我的代码是:

 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));

Test类增加了正确的注释:

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

我的过滤器被定义(在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>

当我尝试在@ContextConfiguration添加web.xml中失败了,当我删除它,我得到一个例外:

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

有没有什么办法DelegatingProxyFilter添加到测试方面,在我的安全context.xml中定义使它能工作的配置呢? 我试过几个教程与注射FilterProxyChain,但它不是我的情况下工作。

有人能帮助我吗? 提前致谢

Answer 1:

更新 :春季安全4+提供开箱即用的集成MockMvc 。 为了使用它确保您使用的apply(springSecurity())如下图所示:

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();
    }
    ...
}

原来的答案

我不知道你的意思是“当我尝试在@ContextConfiguration添加web.xml中失败”,然而,你可以使用Spring MVC的测试,以验证春季安全。 有一个很好的春天-测试- MVC项目概述例子 。

基本轮廓看起来是这样的:

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

这个想法是,你@AutowireFilterChainProxy (什么DelegatingProxyFilter与会代表),并指示MockMvc使用FilterChainProxy

注:弹簧试验-MVC集成到弹簧试验-3.2 +和春季3.1.X一个单独的项目,所以你可以使用的例子相当互换(弹簧试验MVC不具备支持@WebAppConfiguration并有权使用WebContextLoader代替)。



Answer 2:

添加在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>

并使用org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors授权请求。 见样品使用在https://github.com/rwinch/spring-security-test-blog ( https://jira.spring.io/browse/SEC-2592 )



文章来源: Spring MVC integration tests with Spring Security