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を追加しようとすると失敗する」とはどういう意味かわかりませんが、SpringTestMVCを使用してSpringSecurityを検証できます。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();
    }
}

アイデアは、あなた@AutowireFilterChainProxyDelegatingProxyFilter委任先)であり、MockMvcを使用するように指示することFilterChainProxyです。

spring-test-mvcはspring-test-3.2+とSpring3.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 に答える