26

我正在尝试使用 mvc-test 测试我的登录页面。在添加弹簧安全性之前,我工作得很好。

我的代码是:

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

测试类添加了正确的注释:

@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 以使用我的 security-context.xml 中定义的配置来测试上下文以使其正常工作?我尝试了一些关于注入 FilterProxyChain 的教程,但在我的情况下它不起作用。

有人可以帮我吗?提前致谢

4

2 回答 2

60

更新:Spring Security 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 Test MVC 来验证 Spring Security。spring-test-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();
    }
}

这个想法是你@Autowire(代表FilterChainProxy什么DelegatingProxyFilter)并指示MockMvc使用FilterChainProxy.

注意spring-test-mvc 已集成到 spring-test-3.2+ 和 Spring 3.1.x 的单独项目中,因此您可以相当互换地使用该示例(spring-test-mvc 不支持@WebAppConfiguration并且必须使用WebContextLoader) .

于 2013-01-28T20:29:50.233 回答
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 )上的示例用法

于 2014-05-14T21:25:29.960 回答